一天一个设计模式---适配器模式
来源:互联网 发布:淘宝我的收货地址在哪 编辑:程序博客网 时间:2024/06/05 00:19
介绍:适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
优点:
1. 如果不使用适配器,而是修改原有接口代码,这样会导致大量使用原有接口的方法需要被重写
2. 客户端可以调用同一接口,对客户端来感受不到变化
3. 将目标类和适配者类解耦
一、场景
小明去香港买了个iphone7 puls,拿回大陆的家中,发现港式插头为三孔插头电压为200v,家中插头都为二空的220v电压,用不了(如图)。这个时候,小明只能再去买个转换头了。
需求:香港提供的苹果插头为三孔200v,客户需求适配器的功能是将三孔转成二孔220v。
苹果的输出电流是10I。
分析:对于电压转换,可见对应电阻应该为20欧和22欧。对于插孔,前者有火线、零线、地线,而后者只需要火线和零线即可。
二、角色及作用
三、类适配器
原接口–三孔插头 输入电压200v
public 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
0 0
- 一天一个设计模式(4):适配器模式
- 一天一个设计模式---适配器模式
- 一天一个设计模式之适配器模式(Adapter)
- 一天一个设计模式(1): 代理模式
- 一天一个设计模式(2): 外观模式
- 一天一个设计模式(3):观察者模式
- 一天一个设计模式---单例模式
- 一天一个设计模式---代理模式
- 一天一个设计模式---享元模式
- 一天一个设计模式---工厂方法模式
- 一天一个设计模式---抽象工厂模式
- 一天一个设计模式---装饰者模式
- 一天一个设计模式---观察者模式
- 一天一个设计模式---状态模式
- 一天一个设计模式---策略模式
- 一天一个设计模式---模板方法模式
- 一天一个设计模式---生成器模式
- 一天一个设计模式---原型模式
- SPI中的极性CPOL和相位CPHA是什么以及如何设置
- 如何在视频播放页面单独打开横屏
- 【hdu4844 && bzoj2538】【Ctsc2000】【DP优化】公路巡逻
- 随手笔记-VS文件操作
- Swift语法11.函数
- 一天一个设计模式---适配器模式
- Genymotion配置及使用教程大解剖
- 将博客搬至CSDN
- 有了这项技术,iPhone7能否"重新定义"手机摄影
- 恶意软件套餐:Cryptor攻击和信息窃取木马
- iOS有关uilable的部分操作
- android studio 项目集成butterknife
- ScrollView和GridView嵌套使用出现的冲突问题
- 如何挖掘Nginx日志中隐藏的金矿?