设计模式-适配器模式

设计模式-Design Pattern
  一套反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结
目的:可重用代码、代码易懂、可靠性高

GitHub地址:https://github.com/soft-tank/design-pattern

 

适配器模式

  将一个现有的接口,转换成需求所需要的另一个接口

  为了解决不兼容、不匹配的问题引入

实现方式:继承和组合

  |--继承:实现接口,继承需要适配的类到实现类

    |--优点:不需要内部组合一个被适配的类,可以直接使用进行适配

    |--缺点:java 单继承,如果被适配的类有多个,就需要有多个适配器

  |--组合:实现接口,组合需要适配的类到实现类

    |--优点:如果被适配的类有多个,可以一块组合到适配器

    |--缺点:更换适配器的实现过程比较复杂

过多的使用适配器会造成系统调用混乱,代码难以维护,最好的办法还是重构代码设计合适的接口

思路:

  1、被适配的类

  2、目标接口

  3、接口实现类(适配器,这一步对被适配的类进行适配)

  4、客户端调用目标接口

被适配的类

 1 /**
 2  * 
 3  * 适配器模式
 4  * 
 5  * 即将被适配的类
 6  * 
 7  * @author coffee
 8  *
 9  */
10 public class Adaptee {
11 
12     public void doSomethingOld() {
13         System.out.println("执行旧方法...");
14     }
15 }

 

目标接口

 1 /**
 2  * 
 3  * 适配器模式
 4  * 接口
 5  * 
 6  * @author coffee
 7  *
 8  */
 9 public interface Target {
10     void doSomething();
11 }

 

接口实现类(继承和组合的方式实现)

第一种:继承

 1 /**
 2  * 
 3  * 适配器模式:继承方式
 4  * 
 5  * 实现接口Target 继承需要适配的类Adaptee到实现类AdapterExtented
 6  * 
 7  * @author coffee
 8  *
 9  */
10 public class AdapterExtented extends Adaptee implements Target {
11 
12     @Override
13     public void doSomething() {
14 
15         System.out.println("我是适配器,正在适配旧方法...继承方式实现");
16         this.doSomethingOld();
17     }
18 }

第二种:组合

 1 /**
 2  * 
 3  * 适配器模式:组合实现
 4  * 
 5  * 实现Target 组合需要适配的类Adaptee到实现类Adapter
 6  * 
 7  * @author coffee
 8  *
 9  */
10 public class Adapter implements Target {
11 
12     private Adaptee adaptee;
13 
14     public Adapter() {
15 
16     }
17 
18     public Adapter(Adaptee adaptee) {
19         this.adaptee = adaptee;
20     }
21 
22     @Override
23     public void doSomething() {
24 
25         System.out.println("我是适配器,正在适配旧方法...组合方式实现");
26         adaptee.doSomethingOld();
27     }
28 
29 }

 

客户端调用目标接口

 1 /**
 2  * 
 3  * 适配器模式:客户端
 4  * 
 5  * @author coffee
 6  *
 7  */
 8 public class Client {
 9 
10     private Target target;
11 
12     public Client() {
13 
14     }
15 
16     public Client(Target target) {
17         this.target = target;
18     }
19 
20     public void execute() {
21         target.doSomething();
22     }
23 }

 

测试代码

 1 public class AdapterTest {
 2 
 3     Adaptee adaptee = new Adaptee();
 4 
 5     @Before
 6     public void before() {
 7         adaptee.doSomethingOld();
 8         System.out.println("...这个方法已过时,接下来用适配器兼容这个方法以生成新的方法");
 9     }
10 
11     @Test
12     public void testAdapter() {
13 
14         // 组合方式实现
15         Target adapter = new Adapter(adaptee);
16 
17         Client client = new Client(adapter);
18         client.execute();
19     }
20 
21     @Test
22     public void AdapterExtented() {
23 
24         // 继承方式实现
25         Target adapter = new AdapterExtented();
26 
27         Client client = new Client(adapter);
28         client.execute();
29     }
30 }
View Code

  如有理解不当或建议,欢迎指正

posted @ 2018-04-04 14:00  不放糖的咖啡  阅读(121)  评论(0编辑  收藏  举报