一天一个设计模式---适配器模式
2016-09-14 09:40
190 查看
介绍:适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
优点:
1. 如果不使用适配器,而是修改原有接口代码,这样会导致大量使用原有接口的方法需要被重写
2. 客户端可以调用同一接口,对客户端来感受不到变化
3. 将目标类和适配者类解耦
![](https://img-blog.csdn.net/20160914093805690)
需求:香港提供的苹果插头为三孔200v,客户需求适配器的功能是将三孔转成二孔220v。
苹果的输出电流是10I。
分析:对于电压转换,可见对应电阻应该为20欧和22欧。对于插孔,前者有火线、零线、地线,而后者只需要火线和零线即可。
![](https://img-blog.csdn.net/20160914093615938)
目标接口—二孔插头 输入电压220v
类适配器—通过继承原接口
测试代码
输出如下
成功实现目标业务
更多模式: 一天一个设计模式—分类与六大原则
更多源码: https://github.com/oDevilo/Java-Base
优点:
1. 如果不使用适配器,而是修改原有接口代码,这样会导致大量使用原有接口的方法需要被重写
2. 客户端可以调用同一接口,对客户端来感受不到变化
3. 将目标类和适配者类解耦
一、场景
小明去香港买了个iphone7 puls,拿回大陆的家中,发现港式插头为三孔插头电压为200v,家中插头都为二空的220v电压,用不了(如图)。这个时候,小明只能再去买个转换头了。需求:香港提供的苹果插头为三孔200v,客户需求适配器的功能是将三孔转成二孔220v。
苹果的输出电流是10I。
分析:对于电压转换,可见对应电阻应该为20欧和22欧。对于插孔,前者有火线、零线、地线,而后者只需要火线和零线即可。
二、角色及作用
角色 | 作用 |
---|---|
原接口 | 需要适配的接口 |
目标接口 | 客户所期待的接口 |
适配器 | 把原接口转换成目标接口 |
三、类适配器
原接口–三孔插头 输入电压200vpublic class HongkongPlug { int voltage = 200; int rs = 20; // 200v的输出方法 public void twoHundredV() { System.out.println(voltage / rs); } // 三孔插头 public void threeHole() { neutralWire(); liveWire(); groundWire(); } public void neutralWire() { System.out.println("火线"); }; public void liveWire() { System.out.println("零线"); }; public void groundWire() { System.out.println("地线"); }; }
目标接口—二孔插头 输入电压220v
public interface MainlandPlug { // 220v的输出方法 public void twoHundredTwentyV(); // 两孔插头 public void twoHole(); }
类适配器—通过继承原接口
public class ClassAdapter extends HongkongPlug implements MainlandPlug { @Override public void twoHundredTwentyV() { voltage = 220; rs += 2; twoHundredV(); } @Override public void twoHole() { neutralWire(); liveWire(); } }
测试代码
public static void main(String[] args) { HongkongPlug hk=new HongkongPlug(); hk.threeHole(); hk.twoHundredV(); System.out.println("=========回到大陆"); ClassAdapter ad =new ClassAdapter(); ad.twoHole(); ad.twoHundredTwentyV(); }
输出如下
火线 零线 地线 10 =========回到大陆 火线 零线 10
成功实现目标业务
四、对象适配器
区别:类适配器通过继承原接口的方式实现适配,而对象适配器通过持有原接口对象的方式实现适配。public class ObjectAdapter implements MainlandPlug { private HongkongPlug hkp; public ObjectAdapter(HongkongPlug hkp) { this.hkp = hkp; } @Override public void twoHundredTwentyV() { hkp.voltage = 220; hkp.rs += 2; hkp.twoHundredV(); } @Override public void twoHole() { hkp.neutralWire(); hkp.liveWire(); } }
更多模式: 一天一个设计模式—分类与六大原则
更多源码: https://github.com/oDevilo/Java-Base
相关文章推荐
- 一天一个设计模式之适配器模式(Adapter) 推荐
- 一天一个设计模式(4):适配器模式
- 一天一个设计模式之适配器模式(Adapter)
- 一天一个设计模式---享元模式
- 一天一个设计模式之建造者模式(Builder)
- 一天一个设计模式(5):中介者模式
- 设计模式 一个示例让你明白适配器模式
- 一天一个设计模式(1): 代理模式
- 一天一个设计模式---分类与六大原则
- 一天一个设计模式---抽象工厂模式
- 一天一个设计模式---状态模式
- 一天一个设计模式--单例模式
- 一天一个设计模式之职责链模式(Chain of Responsibility)
- 一天一个设计模式---观察者模式
- 一天一个设计模式---生成器模式
- 一天一个设计模式---工厂方法模式
- 一天一个设计模式(3):观察者模式
- 一天一个设计模式之单例模式(singleton)
- 一天一个设计模式(2): 外观模式
- 设计模式 -- 一个示例让你明白适配器模式