• 适配器模式是什么?
  • 为什么要有适配器模式?
  • 用一个例子来看看代码的实现

适配器模式是什么?

我的理解:
比如现实世界,电脑充电需要的电压是12V,而家用电压是220V,肯定不能直接用呀,那不就炸了呀。所以我们需要一个”中间设备“,将220V电压转为12V,这个“中间设备”就叫做Adapter适配器。
好了,以上就出现3个角色了:

  1. 所需电压(12V)
  2. 适配器
  3. 现有电压(220V)

为什么要有适配器模式?

我的理解:
在不改变现有程序的情况下,通过创建一个适配器,去扩展我们所需的程序。

用一个例子来看看代码的实现

  1. 我们需要打印一个字符串,所需接口是Print,他有两个方法,分别是printWeak弱显示(将字符串用括号括起来),强显示printStrong(将字符串用*括起来)
public interface Print {public void printWeak();public void printString();
}
  1. 巧了我们现在有一个现成的类Banner,他里面刚好有这两个方法,但是他们方法名不一样,分别是showWithParen和showWithAster,我们很想用,但是没办法直接用,总不可能把现有的类的方法名给改了吧。
public class Banner {private String string;public Banner(String string) {this.string = string;}public void showWithParen() {System.out.println("(" + string + ")");}public void showWithAster() {System.out.println("*" + string + "*");}
}
  1. 所以需要一个适配器PrintBanner,他实现了接口Print,又继承了Banner,在实现接口方法里面直接用Banner的方法就好啦。
public class PrintBanner extends Banner implements Print {public PrintBanner(String string) {super(string);}@Overridepublic void printWeak() {showWithParen();}@Overridepublic void printString() {showWithAster();}
}

上面这种属于类适配器模式(使用继承的适配器)。
有一种情况是,当Print不是接口,而是抽象类怎么办呢,PrintBanner不能继承两个父类呀,这时候就可以用下面方式解决:

  1. Print接口改为abstract类
public abstract class Print {public abstract void printWeak();public abstract void printString();
}
  1. PrintBanner类只继承Print,然后将Banner作为成员属性“组合”进来
public class PrintBanner extends Print{private Banner banner;public PrintBanner(String string) {banner = new Banner(string);}@Overridepublic void printWeak() {banner.showWithParen();}@Overridepublic void printString() {banner.showWithAster();}
}

这样Banner和Main都不用改变,一样可以实现适配器模式。从以上两种方式都可以看出,他们的本质都是一样的,都**在不改变现有程序(Banner)**的情况下,使用适配器(PrintBanner)去扩展,以便成为我们所需的程序。

用于填补“现有程序”和“所需程序”之间差异的设计模式就是Adapter模式,也称为Wrapper模式。
Adapter模式有两种:

  1. 类适配器模式(使用继承的适配器)
  2. 对象适配器模式(使用委托的适配器)


分割线=======================================================================

对于Target这里(就是例子里的Print),为什么要用一个接口或抽象类来调用,而不直接用Adapter这个具体类呢?
这就是典型的总想着用具体的类来解决所有的问题。这样很容易导致类之间的强耦合,这些类也难以作为组件被再次利用。要记住:“不要只使用具体的类来编程,要优先使用抽象类和接口来编程”。

设计模式-Adapter模式(适配器模式)相关推荐

  1. 设计模式-Adapter模式

    目录 相关概念 对象适配器 类适配器 一个例子 总结 适配器模式(Adapter Pattern)是结构型模式.主要用来解决接口不兼容的问题,将一个类的接口变换成客户端所期待的另一种接口,从而使原本因 ...

  2. 设计模式Adapter模式的五分钟

    五分钟一个设计模式.来形容叙述的设计模式的最简单方法.看到许多其他设计模式,请点击五分钟一个设计模式系列 http://blog.csdn.net/daguanjia11/article/catego ...

  3. 23种设计模式——工厂模式+适配器模式实战

    一.简介 业务需求,需要对不同的浏览器返回不同的url地址. 例如: Chrom浏览器返回:'http://www.chrom.com', IE浏览器返回:'http://www.ie.com' 二. ...

  4. 设计模式【7】——适配器模式(Adapter 模式)

    文章目录 前言 一.适配器模式(Adapter 模式) 二.具体源码 1.Adapter.h 2.Adapter.cpp 3.main.cpp 三.运行结果 总结 前言 实际上在软件系统设计和开发中, ...

  5. Java设计模式(建造者模式-适配器模式-桥接模式)

    Java设计模式Ⅲ 1.建造者模式 1.1 建造者模式概述 1.2 建造者模式的注意事项和细节 1.3 代码理解 2.适配器模式 2.1 类适配器模式 2.1.1 代码理解 2.2 对象适配器模式 2 ...

  6. 设计模式学习笔记——适配器(Adapter)模式

    设计模式学习笔记--适配器(Adapter)模式 @(设计模式)[设计模式, 适配器模式, adapter, 适配器] 设计模式学习笔记适配器Adapter模式 基本介绍 适配器案例 类适配器模式 类 ...

  7. 《设计模式详解》结构型模式 - 适配器模式

    适配器模式 5.2 适配器模式 5.2.1 概述 5.2.2 结构 5.2.3 类适配器模式 5.2.4 对象适配器模式 5.2.5 接口适配器模式 5.2.6 应用场景 5.2.7 JDK 源码 - ...

  8. 精读《设计模式 - Adapter 适配器模式》

    Adapter(适配器模式) Adapter(适配器模式)属于结构型模式,别名 wrapper,结构性模式关注的是如何组合类与对象,以获得更大的结构,我们平常工作大部分时间都在与这种设计模式打交道. ...

  9. 图解Java设计模式学习笔记——结构型模式(适配器模式、桥接模式、装饰者模式、组合模式、外观模式、享元模式、代理模式)

    一.适配器模式(类适配器.对象适配器.接口适配器) 1.现实生活中的例子 泰国插座用的是两孔的(欧标),可以买个多功能转换插头(适配器),这样就可以使用了国内的电器了. 2.基本介绍 适配器模式(Ad ...

  10. 设计模式(三)Adapter(适配器模式)

    设计模式(三)Adapter(适配器模式) 结构 实例 声明 Adapter(适配器模式):将一个类的接口转换成客户希望的另外一个接口.A d a p t e r模式使得原本由于接口不兼容而不能一起工 ...

最新文章

  1. 不管你的x86能不能升级Win 11,反正树莓派能!|安装教程
  2. 新手建议学php吗,关于PHP新手学习的一些指导和建议,新手来我的
  3. CodeBlcoks插件
  4. css cursor url用法格式详解
  5. css 弹性盒子200304
  6. vue 多页面应用例子_【微服务】137:Vue之生命周期钩子
  7. K均值算法(K-means)
  8. insist fortress g55 机械键盘得救了
  9. Date.getyear()、Date.getMonth()、Date.getDay() 已经作废,其他解决办法
  10. 详细解释:Epoch、batch_size批处理大小、迭代次数之间的关系
  11. 遗传编程(GA,genetic programming)算法初探,以及用遗传编程自动生成符合题解的正则表达式的实践...
  12. 从零开始学 Python 之环境搭建
  13. web安全与字体——刘尧博士讲座--PDF安全
  14. 【转】Jackson之多态反序列化(父类转不同子类)
  15. QRCode二维码相关资料
  16. 新手村 - 第三站,认识均线系统
  17. 生活中要怎么预防马尾神经损伤
  18. 双一流大学名单--仅供参考
  19. ARMv8-M蓝牙协议安全增强
  20. 非搜浏览器扩展插件说明

热门文章

  1. 金融量化之华泰多因子估值类显著性和IC值计算
  2. JAVA设计模式 — 生成器模式(Builder)
  3. 有限差分法与有限单元法的区别
  4. 计算机屏幕截图如何保存,怎么在屏幕截图
  5. MATLAB人脸识别系统[GUI界面,完美运行,详细解析]
  6. 31部黑客电影,你看过哪几部?
  7. 关于各式竞赛书籍的点评
  8. 浅谈《分布式光伏发电系统电气安全技术规范》
  9. 关于FbinstTool加入360急救盘见解
  10. ie浏览器不显示echart的Tooltip故障修复