适配器模式

Posted yangxiaojie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了适配器模式相关的知识,希望对你有一定的参考价值。

适配器模式定义:将一个类的接口,转化成客户期望的另一个接口,适配器让原来接口不兼容的类可以合作无间。

适配器在现实中的表现:插座转化器,形状拼图等等。
面向对象中的实现:
本文例子:
  • 狗类,兔子类,适配器类,测试类

要求:

1.缺少兔子类对象,先用狗类冒充一下
2.不会让客户调用兔子类的方法,发生改变(例如在客户调用的方法内做判断如果是某个值,去调用狗类的方法,去冒充兔子类)

代码实现:

狗的接口类

技术分享图片
 1 package com.adapterPattern.dog;
 2 
 3 /**
 4  * @program: test
 5  * @description: 狗
 6  * @author: Mr.Yang
 7  * @create: 2018-12-15 16:17
 8  **/
 9 public interface Dog {
10 
11     /**
12      * 狗也会跳,不过没有兔子跳的远
13      */
14     public void  jump();
15 
16     /**
17      * 狗会发出汪汪的叫声
18      */
19     public void bark();
20 }
View Code
 

项目初始,已经存在的小黑狗类,先用这个顶替一个新的兔子类

技术分享图片
 1 package com.adapterPattern.dog;
 2 
 3 /**
 4  * @program: test
 5  * @description: 小黑狗,实现了狗接口的具体类
 6  * @author: Mr.Yang
 7  * @create: 2018-12-15 16:19
 8  **/
 9 public 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 }
View Code
 

兔子的接口类

技术分享图片
 1 package com.adapterPattern.rabbit;
 2 
 3 /**
 4  * @program: test
 5  * @description: 兔子
 6  * @author: Mr.Yang
 7  * @create: 2018-12-15 16:13
 8  **/
 9 public interface Rabbit {
10 
11     /**
12      * 兔子拥有跳的方法
13      */
14     public void jump();
15 
16     /**
17      * 兔子会咕咕叫
18      */
19     public  void coo();
20 }
View Code
 

项目初始,已经存在的兔子类

技术分享图片
 1 package com.adapterPattern.rabbit;
 2 
 3 /**
 4  * @program: test
 5  * @description: 小白兔类,实现兔子接口的具体类
 6  * @author: Mr.Yang
 7  * @create: 2018-12-15 16:16
 8  **/
 9 public class LittleWhiteRabbit implements Rabbit{
10 
11     public void jump() {
12         System.out.println("小白兔,跳2米");
13     }
14 
15     public void coo() {
16         System.out.println("小白兔,在咕咕叫");
17     }
18 }
View Code
 

适配器类,负责将已经存在的小黑狗先顶替成新的鸭子

技术分享图片
 1 package com.adapterPattern.adapter;
 2 
 3 import com.adapterPattern.dog.Dog;
 4 import com.adapterPattern.rabbit.Rabbit;
 5 
 6 /**
 7  * @program: test
 8  * @description: 缺兔子对象,适配器负责将狗类充当为兔子类
 9  * @author: Mr.Yang
10  * @create: 2018-12-15 16:21
11  **/
12 public 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 }
View Code
 

测试类--testRabbit()方法相等于客户之前的调用方法。通过适配器,成功的将新的兔子类给实现了,只不过内部走的是狗的方法。testRabbit()还是正常的调用,不做任何改变。

技术分享图片
 1 package com.adapterPattern.patternTest;
 2 
 3 import com.adapterPattern.adapter.ActAsRabbitAdapter;
 4 import com.adapterPattern.dog.Dog;
 5 import com.adapterPattern.dog.LittleBlackDog;
 6 import com.adapterPattern.rabbit.LittleWhiteRabbit;
 7 import com.adapterPattern.rabbit.Rabbit;
 8 
 9 /**
10  * @program: test
11  * @description: 适配器模式测试类
12  * @author: Mr.Yang
13  * @create: 2018-12-15 16:26
14  **/
15 public 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 }
View Code
 

测试结果

技术分享图片
 1 ----------------------兔子的跳与叫--------------------
 2 小白兔,跳2米
 3 小白兔,在咕咕叫
 4 ----------------------狗的跳与叫--------------------
 5 小黑狗,跳一米
 6 小黑狗,汪汪的叫
 7 ----------------------适配器(相等于兔子)的跳与叫--------------------
 8 小黑狗,跳一米
 9 小黑狗,跳一米
10 小黑狗,汪汪的叫
View Code

 


以上是关于适配器模式的主要内容,如果未能解决你的问题,请参考以下文章

如何将数据从回收器适配器发送到片段 |如何从 recyclerview 适配器调用片段函数

如何从片段适配器启动活动

片段中ListView的android自定义适配器

设计模式之单例模式

片段内带有基本适配器的列表视图

片段中gridview的Android文本和图像适配器