设计模式——适配器模式(附代码示例)
一. 适配器模式
1. 概念
适配器模式(Adapter Rattern)将某个类的接口转换成客户端期望的另一个接口表示,主的目的是兼容性,让原本因接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper)。类比,U盘插个转换头可用与手机type-c接口相连接;或者是使用多功能转换插头,实现三孔插头与两孔插座相连。
2. 工作原理
适配器模式将一个类的接口转换成另一种接口,让原本接口不兼容的类可以兼容。从用户的角度看不到被适配者,是解耦的;用户调用适配器转化出来的目标接口方法,适配器再调用被适配者的相关接口方法;用户收到反馈结果,感觉只是和目标接口交互。
3. 分类
适配器模式属于结构型模式,主要分为三类:类适配器模式、对象适配器模式、接口适配器模式。
二. 类适配器模式
1. 概念
Adapter类,通过继承src类,实现dst类接口,完成src->dst的适配。
缺点:Java是单继承机制,所以类适配器需要继承src类;要求dst必须是接口,有一定局限性;src类的方法在Adapter中都会暴露出来,也增加了使用的成本。
优点:由于其继承了src类,所以它可以根据需求重写src类的方法,使得Adapter的灵活性增强了。
2. 类图
以充电器转换电压为例
3. 代码示例
Voltage220V类,表示被适配类,输出220v电压
//被适配类
public class Voltage220V {//输出220V的电压public int output220V(){int src = 220;System.out.println("电压="+src+"伏");return src;}
}
IVoltage5V接口,表示适配接口,抽象输出5v的方法
//适配接口
public interface IVoltage5V {public int output5V();
}
VoltageAdapter类,表示适配器类,继承被适配类,又实现适配接口,实现220v->5v转换
public class VoltageAdapter extends Voltage220V implements IVoltage5V{@Overridepublic int output5V() {int srcV = output220V();//获取220vint dstV = srcV / 44;//转成5vreturn dstV;}
}
Phone类,实现充电方法
public class Phone {//充电public void charging(IVoltage5V iVoltage5V){if(iVoltage5V.output5V()==5){System.out.println("电压为5v,可以充电");}else if(iVoltage5V.output5V()>5){System.out.println("电压大于5v,无法充电");}}
}
Client类,客户端
public class Client {public static void main(String[] args) {Phone phone = new Phone();phone.charging(new VoltageAdapter());}
}
输出结果
三. 对象适配器模式
1. 概念
基本思路和类的适配器模式相同,只是将Adapter类作修改,不是继承src类,而是持有src类的实例,以解决兼容性的问题。即:持有src类,实现dst类接口,完成src->dst的适配。根据“合成复用原则”,在系统中尽量使用关联关系来替代继承关系。对象适配器模式是适配器模式常用的一种。
2. 类图
仍以充电器转换电压为例,只需改变适配器类和客户端,其他不变
3.代码示例
Voltage220V类,表示被适配类,输出220v电压
//被适配类
public class Voltage220V {//输出220V的电压public int output220V(){int src = 220;System.out.println("电压="+src+"伏");return src;}
}
IVoltage5V接口,表示适配接口,抽象输出5v的方法
//适配接口
public interface IVoltage5V {public int output5V();
}
VoltageAdapter类,表示适配器类,实现适配接口,通过聚合关系持有Voltage220V类而不再是继承,实现220v->5v转换
public class VoltageAdapter implements IVoltage5V {private Voltage220V voltage220V;//根据构造器,传入一个Voltage220V,聚合关系public VoltageAdapter(Voltage220V voltage220V) {this.voltage220V = voltage220V;}@Overridepublic int output5V() {int dstV = 0;if (null != voltage220V) {int srcV = voltage220V.output220V();//获取220vdstV = srcV / 44;//转成5v}return dstV;}
}
Phone类,实现充电方法
public class Phone {//充电public void charging(IVoltage5V iVoltage5V){if(iVoltage5V.output5V()==5){System.out.println("电压为5v,可以充电");}else if(iVoltage5V.output5V()>5){System.out.println("电压大于5v,无法充电");}}
}
Client类,客户端
public class Client {public static void main(String[] args) {System.out.println("对象适配器模式");Phone phone = new Phone();phone.charging(new VoltageAdapter(new Voltage220V()));}
}
输出结果
四. 接口适配器模式
1. 概念
又称适配器模式(Default Adapter Pattern)或缺省适配器模式。当不需要全部实现接口提供的方法时,可先设计一个抽象类实现接口,并为该接口中每个方法提供一个默认实现(空方法),那么该抽象类的子类可有选择地覆盖父类的某些方法来实现需求。适用于一个接口不想使用其所有的方法的情况。
2. 类图
3.代码示例
接口Interface4,表示提供4个方法
public interface Interface4 {public void m1();public void m2();public void m3();public void m4();
}
AbsAdapter抽象类,实现接口,并使接口每个方法默认空实现
public abstract class AbsAdapter implements Interface4{//默认实现@Overridepublic void m1() {}@Overridepublic void m2() {}@Overridepublic void m3() {}@Overridepublic void m4() {}
}
Client类,通过匿名内部类的方式,有选择地覆盖父类的某些方法来实现需求
public class Client {public static void main(String[] args) {AbsAdapter absAdapter = new AbsAdapter() {@Overridepublic void m1() {System.out.println("只想使用m1的方法,只需覆盖m1的方法");}};absAdapter.m1();}
}
输出结果
五. 总结
类适配器: 以类给到,在Adapter里,就是将src当做类,继承
对象适配器: 以对象给到,在Adapter里,将src作为一个对象,持有
接口适配器: 以接口给到,在Adapter里,将src作为一个接口,实现
Adapter模式最大的作用还是将原本不兼容的接口融合在一起工作。
设计模式——适配器模式(附代码示例)相关推荐
- 什么是mvc设计模式 (附代码示例)
什么是mvc设计模式,举一个mvc设计模式的例子. 答:mvc设计模式是用模型/试图/控制器三元组用来构建用户界面.一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集到 ...
- torch.bernoulli 的使用方法(附代码示例)
torch.bernoulli 的使用方法(附代码示例) 功能解释 参数 代码示例 功能解释 *torch.bernoulli(input, , generator=None, out=None) → ...
- Spring源码深度解析,Spring源码以及Bean的生命周期(五)(附代码示例:)
五)Bean 的生命周期,创建---初始化---销毁的过程 目录 五)Bean 的生命周期,创建---初始化---销毁的过程 一 , 指定初始化方法 init-method 方法 二 ,指定销毁 ...
- 设计模式——七大原则(附代码示例)
一. 设计模式概念 对接口编程而不是对实现编程:优先使用对象组合而不是继承 二. 设计模式总览 1. 创建型模式(Creational Patterns):(5) 单例(Singlet ...
- 设计模式——迭代器模式(附代码示例)
一. 传统方式 以学校院系展示为例,实现在一个页面展示学校的院系组成,一个学校有多个学院,一个学院有多个系.传统方式实现类图如下: 传统方式将学院看做是学校的子类,系是学院的子类,这样实际上是站在组织 ...
- 设计模式——代理模式(附代码示例)
一. 代理模式 1. 概念 代理模式为一个对象提供一个替身,以控制对这个对象的访问.即通过代理对象访问目标对象.这样做的好处是可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.被代 ...
- 设计模式——中介者模式(附代码示例)
一. 传统方式 以闹铃响起--咖啡机开始做咖啡--窗帘自动落下--电视机开始播放为例 1. 传统方式解决 创建各个相关类,且各类中彼此联系,最后直接在Client中按照流程执行各类方法 2. 传统方式 ...
- 设计模式——职责链模式(附代码示例)
一. 传统方式 以学校采购审批为例,不同金额的采购需要不同人员的审批 1. 传统方式解决 收到请求后,通过不同的金额调用对应的审批方法 2. 传统方式存在问题 Client会使用到分支判断(比如swi ...
- 设计模式——享元模式(附代码示例)
一. 传统方式 以网站项目展示为例,有的要求以新闻形式发布,有的要求以博客形式发布,有的要求以微信公众号形式发布 1. 传统方式解决 给每个网站租用一个空间,直接复制粘贴一份,然后根据客户不同要求,进 ...
最新文章
- 搜狗输入法在idea打不了汉字_IDEA开发软件在linux环境下使用搜狗输入法无法进行中文输入...
- Pytorch —— 学习率调整策略
- 软件测试需注意的事项
- 结合CKFinder,给CKEditor加上上传图片功能
- stored to '*' during its initialization is never read
- HDU2094(产生冠军)题解
- php导出数组到csv格式demo
- 大一计算机引论知识点,计算机引论知识点2015.doc
- 基于SK6812编码LED实现炫光功能(PWM+DMA功能MCU兼容)
- 国内域名如何转入 GoDaddy,域名转入GoDaddy要注意?
- O2O的商业组合模式是什么 O2O怎么来引流?
- 什么是MTTF、MTTR、MTBF和MTRF?
- Vue解决导出pdf文件图片展示不全问题
- 3D深度传感ToF技术的基本原理解析
- 其实特简单,Python 做一个漂亮女孩词云跳舞的视频
- unity碰撞检测识别对象的几种方法,刚体篇
- 从航天到原始递归函数的四个定理及其证明——哥德尔读后之十二
- tl494cn逆变器电路图_TL494制作的400W大功率稳压逆变器电路图
- 如何进行产品设计,更能激发用户行为
- matlab弹道仿真,基于Matlab和Simulink的导弹弹道仿真与应用