设计模式-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 }
如有理解不当或建议,欢迎指正