适配器模式定义:将一个类的接口,转化成客户期望的另一个接口,适配器让原来接口不兼容的类可以合作无间。
1.缺少兔子类对象,先用狗类冒充一下 2.不会让客户调用兔子类的方法,发生改变(例如在客户调用的方法内做判断如果是某个值,去调用狗类的方法,去冒充兔子类)
狗的接口类
1package com.adapterPattern.dog;
2
3/**
4 * @program: test
5 * @description: 狗
6 * @author: Mr.Yang
7 * @create: 2018-12-15 16:17
8 **/
9public interface Dog {
10
11 /**
12 * 狗也会跳,不过没有兔子跳的远
13 */
14 public void jump();
15
16 /**
17 * 狗会发出汪汪的叫声
18 */
19 public void bark();
20}
项目初始,已经存在的小黑狗类,先用这个顶替一个新的兔子类
1package com.adapterPattern.dog;
2
3/**
4 * @program: test
5 * @description: 小黑狗,实现了狗接口的具体类
6 * @author: Mr.Yang
7 * @create: 2018-12-15 16:19
8 **/
9public class LittleBlackDog implements Dog{
10
11 public void jump() {
12 System.out.println("小黑狗,跳一米");
13 }
14
15 public void bark() {
16 System.out.println("小黑狗,汪汪的叫");
17 }
18}
兔子的接口类
1package com.adapterPattern.rabbit;
2
3/**
4 * @program: test
5 * @description: 兔子
6 * @author: Mr.Yang
7 * @create: 2018-12-15 16:13
8 **/
9public interface Rabbit {
10
11 /**
12 * 兔子拥有跳的方法
13 */
14 public void jump();
15
16 /**
17 * 兔子会咕咕叫
18 */
19 public void coo();
20}
项目初始,已经存在的兔子类
1package com.adapterPattern.rabbit;
2
3/**
4 * @program: test
5 * @description: 兔子
6 * @author: Mr.Yang
7 * @create: 2018-12-15 16:13
8 **/
9public interface Rabbit {
10
11 /**
12 * 兔子拥有跳的方法
13 */
14 public void jump();
15
16 /**
17 * 兔子会咕咕叫
18 */
19 public void coo();
20}
适配器类,负责将已经存在的小黑狗先顶替成新的鸭子
1package com.adapterPattern.adapter;
2
3import com.adapterPattern.dog.Dog;
4import com.adapterPattern.rabbit.Rabbit;
5
6/**
7 * @program: test
8 * @description: 缺兔子对象,适配器负责将狗类充当为兔子类
9 * @author: Mr.Yang
10 * @create: 2018-12-15 16:21
11 **/
12public class ActAsRabbitAdapter implements Rabbit {
13 Dog dog;
14
15 public ActAsRabbitAdapter(Dog dog){
16 this.dog=dog;
17 }
18
19 /**
20 * 外部还是调用兔子的方法,内部的实现是狗的跳,狗需要跳两次才和兔子跳的距离一样
21 */
22 public void jump() {
23 dog.jump();
24 dog.jump();
25 }
26 /**
27 * 外部还是调用兔子叫的方法,内部的实现是狗的叫
28 */
29 public void coo() {
30 dog.bark();
31 }
32}
测试类--testRabbit()方法相等于客户之前的调用方法。通过适配器,成功的将新的兔子类给实现了,只不过内部走的是狗的方法。testRabbit()还是正常的调用,不做任何改变。
1package com.adapterPattern.patternTest;
2
3import com.adapterPattern.adapter.ActAsRabbitAdapter;
4import com.adapterPattern.dog.Dog;
5import com.adapterPattern.dog.LittleBlackDog;
6import com.adapterPattern.rabbit.LittleWhiteRabbit;
7import com.adapterPattern.rabbit.Rabbit;
8
9/**
10 * @program: test
11 * @description: 适配器模式测试类
12 * @author: Mr.Yang
13 * @create: 2018-12-15 16:26
14 **/
15public class Test {
16 /**
17 * 负责执行鸭子的跳与叫
18 * @param rabbit
19 */
20 public static void testRabbit(Rabbit rabbit){
21 rabbit.jump();
22 rabbit.coo();
23 }
24 /**
25 * 负责执行狗的跳与叫
26 * @param dog
27 */
28 public static void testDog(Dog dog){
29 dog.jump();
30 dog.bark();
31 }
32
33 public static void main(String[] args) {
34 //创建一个兔子类
35 Rabbit rabbit = new LittleWhiteRabbit();
36 //创建一个狗类
37 Dog dog = new LittleBlackDog();
38 //创建一个适配器,包装狗类,为兔子类
39 Rabbit adapterRabbit = new ActAsRabbitAdapter(dog);
40
41 System.out.println("----------------------小白兔的跳与叫--------------------");
42 testRabbit(rabbit);
43
44 System.out.println("----------------------小黑狗的跳与叫--------------------");
45 testDog(dog);
46
47 System.out.println("----------------------适配器(相等于兔子)的跳与叫--------------------");
48 //适配实现了兔子接口,所以可以别认为是个兔子,testRabbit()这个方法并不知道这个是适配器
49 testRabbit(adapterRabbit);
50 }
51}
测试结果
1----------------------兔子的跳与叫--------------------
2小白兔,跳2米
3小白兔,在咕咕叫
4----------------------狗的跳与叫--------------------
5小黑狗,跳一米
6小黑狗,汪汪的叫
7----------------------适配器(相等于兔子)的跳与叫--------------------
8小黑狗,跳一米
9小黑狗,跳一米
10小黑狗,汪汪的叫