现在我们来学习适配器模式,现在我们建一个包,在结构型这个包下,建一个adapter,我们适配器模式呢,主要是分为,类适配器模式,还有对象适配器模式,那这两个适配器模式,最重要的区别,就是一个通过组合,一个通过继承,那我们都来演示一下,首先创建一个包,classadapter,类适配器模式,那这里说一下这个角色,第一个是被适配者

这个类图还是很清晰的,首先Adapter它继承了Adaptee被适配者,同时实现了目标接口,那这样其实Target其实是两种实现的,一种是具体的Target实现类,另外一种通过Adapter,他的实现类就变成了Adaptee的adapteeRequest

package com.learn.design.pattern.structural.adapter.classadapter;/*** * @author Leon.Sun**/
public class Adaptee {/*** 这里面有一个方法* 这个方法是被适配者独有的* 我们起名就叫adapteeRequest* 被适配者的方法* 那下面第二个角色登场* 我们目标要实现成什么样的呢* * */public void adapteeRequest(){System.out.println("被适配者的方法");}}
package com.learn.design.pattern.structural.adapter.classadapter;/*** 对于Target它是一个接口* 他可以有很多实现类* 现在写一个Target的实现类* 具体的Target* * * @author Leon.Sun**/
public interface Target {/*** 定义成接口* 看到这两个方法是不一样的* Target里面是request* Adaptee里面是adapteeRequest* */void request();
}
package com.learn.design.pattern.structural.adapter.classadapter;/*** 他实现Target* * * @author Leon.Sun**/
public class ConcreteTarget implements Target {/*** concreteTarget目标方法* 那具体的Target也有了* 现在我们就要通过Adaptee适配者适配这个被适配者* 来达到Target这个目标* 我们创建Adapter* * */@Overridepublic void request() {System.out.println("concreteTarget目标方法");}}
package com.learn.design.pattern.structural.adapter.classadapter;/*** 由他继承被适配者Adaptee* 然后实现Target接口* 那我们看一下* Adaptee他来实现Target他的接口* 并且它是Adaptee的子类* 那很简单* 我们这里只需要调用父类的adapteeRequest即可* 这样我们就通过Adapter把适配者adapteeRequest这个方法呢适配给了Target* 因为Adapter是Adaptee的子类* 通过调用父类的adapteeRequest方法* 来实现了Target* 那我们看一下* 类图* * 这里面强调的是继承* 通过继承来获取被适配者的一些方法* 我们在实现Target的request方法中* 我们可以增加各种逻辑代码* 这个还是比较好理解的* 那我们现在就换一种模式* 使用对象适配器模式* * * @author Leon.Sun**/
public class Adapter extends Adaptee implements Target{@Overridepublic void request() {//...super.adapteeRequest();//...}
}
package com.learn.design.pattern.structural.adapter.classadapter;/*** * @author Leon.Sun**/
public class Test {public static void main(String[] args) {/*** 我们先写一个具体的Target实现类* new一个ConcreteTarget这个类* 这个类在这里就是为了衬托Adapter* 没有他也是OK的* 但是ConcreteTarget它是Target的直接实现者* 现在我们就通过Adapter就把这个实现交给Adaptee* * */Target target = new ConcreteTarget();/*** 然后调用target的request方法* 这就是一个Target的实现* * 上面是具体的目标的方法* 也就是Target的具体实现* * */target.request();/*** 命名一个adapterTarget* 实现就通过Adapter来实现了* 因为Adapter实现了Adaptee接口* 这个时候调用它的request方法* 通过Adapter已经提交给了Adaptee* 那这个是类适配器模式* * * * */Target adapterTarget = new Adapter();adapterTarget.request();}
}

client的Test就不看了,主要是看这四个类,注意这里是一个组合,第一个Adapter里面有一个Adaptee,他们两都作为Target的实现类,那在对比一下刚刚的UML,Target还是有两个实现类,只不过Adapter和Adaptee之间,并不是通过组合关系,而是通过继承关系,那这个就是类适配器模式,和对象适配器模式最终要的区别,那这两个例子讲完了,现在我们再引入一个生活场景,那我们现在引入一个生活场景,例如我们手机充电,那在中国民用电都是220V的交流电,那我们手机基本上都是锂电池,然后需要5V的直流电,那我们买手机的时候呢,会带电源适配器,他的作用是把220V的交流电呢转化成5V的直流电,那如果不转换呢,手机也就坏了,那那我们现在就使用对象适配器模式,来解决这一个生活场景,那为什么使用对象适配器模式呢,那在继承和组合的时候呢,我们优先选择组合,这个是前面讲原则的时候有讲过的一个原则,当然呢如果没得选,只能通过继承,那也没有办法,那我们被适配者肯定是220V,AC代表交流电
package com.learn.design.pattern.structural.adapter.objectadapter;/*** 首先还是Target这个接口* 这个接口不变* * * @author Leon.Sun**/
public interface Target {void request();
}
package com.learn.design.pattern.structural.adapter.objectadapter;/*** 也就是说换模式的时候* 从类适配器模式* 到对象适配器模式* 被适配者和Target* 是没有变化的* 那具体的原有的Target* 实现类也没有变* * * @author Leon.Sun**/
public class Adaptee {public void adapteeRequest(){System.out.println("被适配者的方法");}}
package com.learn.design.pattern.structural.adapter.objectadapter;/*** * @author Leon.Sun**/
public class ConcreteTarget implements Target {@Overridepublic void request() {System.out.println("concreteTarget目标方法");}}
package com.learn.design.pattern.structural.adapter.objectadapter;/*** 变化的出现在Adapter上* 我们创建一个Adapter* 这里让他直接来实现Target* 然后实现这个方法* 因为没有继承* 所以不能调用父类的方法* 所以我把Adaptee组合到Adapter这个类里面* 然后调用它的adapteeRequest* * 通过组合的方式* 把具体实现Target的方法* 委托给adaptee来实现* 同样的我们这里可以加代码* 我们在看一下这个类图* * * @author Leon.Sun**/
public class Adapter implements Target{private Adaptee adaptee = new Adaptee();@Overridepublic void request() {//...adaptee.adapteeRequest();//...}
}
package com.learn.design.pattern.structural.adapter.objectadapter;/*** 我们在copy代码做版本演进的时候* 一定要注意import里面的包名* 你们可以直接在源代码上改* 我这里是为了演示演进的过程* 以及给适配器模式这两种方式* 方便你们学习* Test的代码是没有任何变化的* 变化的只有一个Adapter* * * @author Leon.Sun**/
public class Test {public static void main(String[] args) {Target target = new ConcreteTarget();target.request();Target adapterTarget = new Adapter();adapterTarget.request();}
}
package com.learn.design.pattern.structural.adapter;/*** * @author Leon.Sun**/
public class AC220 {/*** 返回值是int* 输出220V的交流电* * * @return*/public int outputAC220V(){int output = 220;System.out.println("输出交流电"+output+"V");return output;}
}
package com.learn.design.pattern.structural.adapter;/*** 他的方法就是输出5V的直流电* 那这个就是Target* 那现在我们写一个适配者* PowerAdapter* 电源适配器* * * @author Leon.Sun**/
public interface DC5 {int outputDC5V();
}
package com.learn.design.pattern.structural.adapter;/*** 由他来实现5V的直流电* 首先在这个适配器的输入呢* 现在就通过电源适配器里面还有一个变压器* 实现了220V的交流电转化成5V的直流电* 那我们测试一下* * * @author Leon.Sun**/
public class PowerAdapter implements DC5{/*** 把220V的交流电组合进来* * */private AC220 ac220 = new AC220();/*** 实现这个方法* * */@Overridepublic int outputDC5V() {/*** 赋值220V的交流电* 输出200V交流电赋值给adapterInput* * */int adapterInput = ac220.outputAC220V();//变压器.../*** 输出等于什么呢* 等于输入进来的220V的交流电除以44* 具体交流电和直流电怎么变化的呢* 我们就认为这里是一个变压器* 也就是说我们适配层的逻辑可以写在这里了* 这里就比较简单的* 只把数字除以44* 变成5* * */int adapterOutput = adapterInput/44;/*** 然后输出* 使用电源适配器输入AC* AC多少呢* adapterOutput* 单位* 加上输出* 输出直流电DC* adapterOutput* 然后加上符号* * */System.out.println("使用PowerAdapter输入AC:"+adapterInput+"V"+"输出DC:"+adapterOutput+"V");/*** 这个时候把adapterOutput返回回去* * */return adapterOutput;}}
package com.learn.design.pattern.structural.adapter;/*** * @author Leon.Sun**/
public class Test {public static void main(String[] args) {/*** 首先目标new一个PowerAdapter* * */DC5 dc5 = new PowerAdapter();/*** 然后直接调用电源适配器的outputDC5V* 非常简单* 通过适配器就是这样简单* 结果已经输出了* 首先在AC220这个类里面* 输出了交流电220V* 然后通过PowerAdapter输出* 输入是220V的交流电* 输出是5V的直流电* 和我们预期是一致的* * */dc5.outputDC5V();}
}

适配器模式coding相关推荐

  1. Python设计模式-适配器模式

    Python设计模式-适配器模式 基于Python3.5.2,代码如下 #coding:utf-8class ACpnStaff:name = ""id = "" ...

  2. python适配器模式角色_Python设计模式之适配器模式原理与用法详解

    本文实例讲述了Python设计模式之适配器模式原理与用法.分享给大家供大家参考,具体如下: 适配器模式(Adapter Pattern):将一个类的接口转换成为客户希望的另外一个接口. 下面是一个适配 ...

  3. 阿里巴巴Java开发手册 (Alibaba Java Coding Guidelines)

    参考资料: 阿里巴巴Java开发手册  https://www.cntofu.com/book/78/index.html 一.编程规约 ##(一)命名风格 [强制]代码中的命名均不能以下划线或美元符 ...

  4. idea使用git上传项目到coding

    1.VCS -> import into version control -> create git repository 2.选择要上传的项目根目录 3.选择后,项目里的文件名字变成了绿 ...

  5. 简书php硬件交互,php设计模式——适配器模式

    适配器模式 适配器模式(Adapter)模式:将一个类的接口,转换成客户期望的另一个类的接口.适配器让原本接口不兼容的类可以合作无间.列如:将数据库接口封装成一样的接口, 这样就可以适用于不同场景 案 ...

  6. 强化学习(七) - 函数近似方法 - 随机梯度下降, 半梯度下降,及瓦片编码(Tile Coding)实例

    函数近似方法 7.1 目标预测(VE‾\overline{VE}VE) 7.2 随机梯度下降和半梯度下降 例7.1: 1000态随机行走的状态收敛 7.3 线性近似 7.4 线性方法的特征构造 7.4 ...

  7. 设计模式之适配器模式(Adapter)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  8. 给女友讲讲设计模式——适配器模式(JAVA实例)5

    前言 有这样一个人,看到别人一个个开餐馆赚了好多钱,于是自己也很想在餐饮业这方面大展拳脚,他从别人那里学到了他们的理念,还学习到了他们真正开店的经验.不但如此,他还引进了除了吃饭意外其他的服务,例如说 ...

  9. java设计模式-适配器模式

    模式导读:    每个人都有自己不同的需要,每个人都有自己能够接受的不同方式,就像是为满足现在快速度发展的社会,几乎人人离不开手机的时代,我们也许会碰到在外出行手机电量不足的情况,这个时候如果你在车站 ...

最新文章

  1. 【组队学习】【29期】2. 计算机视觉
  2. 计算机应用基础第四章知识点,计算机应用基础 第四章电子表格笔试知识点总结...
  3. 华为UPS“内外”兼修
  4. python图片识别-用10行Python代码进行图像识别
  5. C++modular exponentiation模幂运算的实现算法(附完整源码)
  6. PIC中档单片机汇编指令详解(6)
  7. php送数据找不到表,php – 数据源默认值中找不到的模型表
  8. python中为什么推荐使用with_Python中的with关键字使用详解
  9. 使用POI读写word docx文件
  10. 辞去程序员一职,我后悔了吗?
  11. 外包软件开发时要避免的五个陷阱
  12. vue 圆形 水波_canvas 水滴图、液体进度条、仿加速球、圆球水波图
  13. 以下不是dns服务器的作用,以下不是DNS服务的作用的是( )。
  14. Jetpack Compose 自定义绘制——高仿Keep周运动数据页面
  15. 幻数java题_关于数组中的幻数?:数组中的幻数? -C ++
  16. 【电路补习笔记】8、稳压电路 —— 线性电源及LDO
  17. 基于Spring+SpringMVC+Mybatis分布式敏捷开发系统架构zhen项目
  18. 温州大学计算机学院-浙江大学信电学院联合招收博士后研究人员招聘启事
  19. 摄像头中 P 制和 N 制的区别
  20. 【golang】golang初始化项目(iris下载与使用)

热门文章

  1. 【WP8.1开发】RenderTargetBitmap类的特殊用途
  2. modbus4-232 485 单机 多机
  3. 降低能耗 企业级闪存进入数据中心领域
  4. Google Chrome等浏览器不允许关闭点击跟踪??
  5. ProxySQL MySQL MGR8配置
  6. Spring保存文件到MongoDB之GridFS支持
  7. 为什么静态成员、静态方法中不能用this和super关键字
  8. 《科学+ 预见人工智能》——物理学家的管理方式
  9. Quick-Cocos2d-x初学者游戏教程(二) -------------------- Quick内部的代码结构及相应的原理...
  10. 执行游戏时出现0xc000007b错误的解决方法