一. 适配器模式

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模式最大的作用还是将原本不兼容的接口融合在一起工作。

设计模式——适配器模式(附代码示例)相关推荐

  1. 什么是mvc设计模式 (附代码示例)

    什么是mvc设计模式,举一个mvc设计模式的例子. 答:mvc设计模式是用模型/试图/控制器三元组用来构建用户界面.一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集到 ...

  2. torch.bernoulli 的使用方法(附代码示例)

    torch.bernoulli 的使用方法(附代码示例) 功能解释 参数 代码示例 功能解释 *torch.bernoulli(input, , generator=None, out=None) → ...

  3. Spring源码深度解析,Spring源码以及Bean的生命周期(五)(附代码示例:)

    五)Bean 的生命周期,创建---初始化---销毁的过程 目录 五)Bean 的生命周期,创建---初始化---销毁的过程 一 ,  指定初始化方法 init-method 方法​ 二 ,指定销毁 ...

  4. 设计模式——七大原则(附代码示例)

    一. 设计模式概念         对接口编程而不是对实现编程:优先使用对象组合而不是继承 二. 设计模式总览 1. 创建型模式(Creational Patterns):(5) 单例(Singlet ...

  5. 设计模式——迭代器模式(附代码示例)

    一. 传统方式 以学校院系展示为例,实现在一个页面展示学校的院系组成,一个学校有多个学院,一个学院有多个系.传统方式实现类图如下: 传统方式将学院看做是学校的子类,系是学院的子类,这样实际上是站在组织 ...

  6. 设计模式——代理模式(附代码示例)

    一. 代理模式 1. 概念 代理模式为一个对象提供一个替身,以控制对这个对象的访问.即通过代理对象访问目标对象.这样做的好处是可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.被代 ...

  7. 设计模式——中介者模式(附代码示例)

    一. 传统方式 以闹铃响起--咖啡机开始做咖啡--窗帘自动落下--电视机开始播放为例 1. 传统方式解决 创建各个相关类,且各类中彼此联系,最后直接在Client中按照流程执行各类方法 2. 传统方式 ...

  8. 设计模式——职责链模式(附代码示例)

    一. 传统方式 以学校采购审批为例,不同金额的采购需要不同人员的审批 1. 传统方式解决 收到请求后,通过不同的金额调用对应的审批方法 2. 传统方式存在问题 Client会使用到分支判断(比如swi ...

  9. 设计模式——享元模式(附代码示例)

    一. 传统方式 以网站项目展示为例,有的要求以新闻形式发布,有的要求以博客形式发布,有的要求以微信公众号形式发布 1. 传统方式解决 给每个网站租用一个空间,直接复制粘贴一份,然后根据客户不同要求,进 ...

最新文章

  1. 搜狗输入法在idea打不了汉字_IDEA开发软件在linux环境下使用搜狗输入法无法进行中文输入...
  2. Pytorch —— 学习率调整策略
  3. 软件测试需注意的事项
  4. 结合CKFinder,给CKEditor加上上传图片功能
  5. stored to '*' during its initialization is never read
  6. HDU2094(产生冠军)题解
  7. php导出数组到csv格式demo
  8. 大一计算机引论知识点,计算机引论知识点2015.doc
  9. 基于SK6812编码LED实现炫光功能(PWM+DMA功能MCU兼容)
  10. 国内域名如何转入 GoDaddy,域名转入GoDaddy要注意?
  11. O2O的商业组合模式是什么 O2O怎么来引流?
  12. 什么是MTTF、MTTR、MTBF和MTRF?
  13. Vue解决导出pdf文件图片展示不全问题
  14. 3D深度传感ToF技术的基本原理解析
  15. 其实特简单,Python 做一个漂亮女孩词云跳舞的视频
  16. unity碰撞检测识别对象的几种方法,刚体篇
  17. 从航天到原始递归函数的四个定理及其证明——哥德尔读后之十二
  18. tl494cn逆变器电路图_TL494制作的400W大功率稳压逆变器电路图
  19. 如何进行产品设计,更能激发用户行为
  20. matlab弹道仿真,基于Matlab和Simulink的导弹弹道仿真与应用

热门文章

  1. 使用SqlSession
  2. ceph 客户端配置
  3. 短视频素材去哪里找?这5个网站,免费看
  4. JAVA 读取TEXT文本数据
  5. 装ubuntu9.10后,笔记本喇叭坏了
  6. 从校园到职场,如果是你会和我一样吗?
  7. Android-UI 借书界面
  8. (六)创建并调试SPFx字段扩展解决方案
  9. Ubuntu Linux Vim用户 改键位
  10. jq 仿手机qq聊天记录滑动删除