设计模式-Adapter模式(适配器模式)
- 适配器模式是什么?
- 为什么要有适配器模式?
- 用一个例子来看看代码的实现
适配器模式是什么?
我的理解:
比如现实世界,电脑充电需要的电压是12V,而家用电压是220V,肯定不能直接用呀,那不就炸了呀。所以我们需要一个”中间设备“,将220V电压转为12V,这个“中间设备”就叫做Adapter适配器。
好了,以上就出现3个角色了:
- 所需电压(12V)
- 适配器
- 现有电压(220V)
为什么要有适配器模式?
我的理解:
在不改变现有程序的情况下,通过创建一个适配器,去扩展我们所需的程序。
用一个例子来看看代码的实现
- 我们需要打印一个字符串,所需接口是Print,他有两个方法,分别是printWeak弱显示(将字符串用括号括起来),强显示printStrong(将字符串用*括起来)
public interface Print {public void printWeak();public void printString();
}
- 巧了我们现在有一个现成的类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 + "*");}
}
- 所以需要一个适配器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不能继承两个父类呀,这时候就可以用下面方式解决:
- Print接口改为abstract类
public abstract class Print {public abstract void printWeak();public abstract void printString();
}
- 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模式有两种:
- 类适配器模式(使用继承的适配器)
- 对象适配器模式(使用委托的适配器)
分割线=======================================================================
对于Target这里(就是例子里的Print),为什么要用一个接口或抽象类来调用,而不直接用Adapter这个具体类呢?
这就是典型的总想着用具体的类来解决所有的问题。这样很容易导致类之间的强耦合,这些类也难以作为组件被再次利用。要记住:“不要只使用具体的类来编程,要优先使用抽象类和接口来编程”。
设计模式-Adapter模式(适配器模式)相关推荐
- 设计模式-Adapter模式
目录 相关概念 对象适配器 类适配器 一个例子 总结 适配器模式(Adapter Pattern)是结构型模式.主要用来解决接口不兼容的问题,将一个类的接口变换成客户端所期待的另一种接口,从而使原本因 ...
- 设计模式Adapter模式的五分钟
五分钟一个设计模式.来形容叙述的设计模式的最简单方法.看到许多其他设计模式,请点击五分钟一个设计模式系列 http://blog.csdn.net/daguanjia11/article/catego ...
- 23种设计模式——工厂模式+适配器模式实战
一.简介 业务需求,需要对不同的浏览器返回不同的url地址. 例如: Chrom浏览器返回:'http://www.chrom.com', IE浏览器返回:'http://www.ie.com' 二. ...
- 设计模式【7】——适配器模式(Adapter 模式)
文章目录 前言 一.适配器模式(Adapter 模式) 二.具体源码 1.Adapter.h 2.Adapter.cpp 3.main.cpp 三.运行结果 总结 前言 实际上在软件系统设计和开发中, ...
- Java设计模式(建造者模式-适配器模式-桥接模式)
Java设计模式Ⅲ 1.建造者模式 1.1 建造者模式概述 1.2 建造者模式的注意事项和细节 1.3 代码理解 2.适配器模式 2.1 类适配器模式 2.1.1 代码理解 2.2 对象适配器模式 2 ...
- 设计模式学习笔记——适配器(Adapter)模式
设计模式学习笔记--适配器(Adapter)模式 @(设计模式)[设计模式, 适配器模式, adapter, 适配器] 设计模式学习笔记适配器Adapter模式 基本介绍 适配器案例 类适配器模式 类 ...
- 《设计模式详解》结构型模式 - 适配器模式
适配器模式 5.2 适配器模式 5.2.1 概述 5.2.2 结构 5.2.3 类适配器模式 5.2.4 对象适配器模式 5.2.5 接口适配器模式 5.2.6 应用场景 5.2.7 JDK 源码 - ...
- 精读《设计模式 - Adapter 适配器模式》
Adapter(适配器模式) Adapter(适配器模式)属于结构型模式,别名 wrapper,结构性模式关注的是如何组合类与对象,以获得更大的结构,我们平常工作大部分时间都在与这种设计模式打交道. ...
- 图解Java设计模式学习笔记——结构型模式(适配器模式、桥接模式、装饰者模式、组合模式、外观模式、享元模式、代理模式)
一.适配器模式(类适配器.对象适配器.接口适配器) 1.现实生活中的例子 泰国插座用的是两孔的(欧标),可以买个多功能转换插头(适配器),这样就可以使用了国内的电器了. 2.基本介绍 适配器模式(Ad ...
- 设计模式(三)Adapter(适配器模式)
设计模式(三)Adapter(适配器模式) 结构 实例 声明 Adapter(适配器模式):将一个类的接口转换成客户希望的另外一个接口.A d a p t e r模式使得原本由于接口不兼容而不能一起工 ...
最新文章
- 不管你的x86能不能升级Win 11,反正树莓派能!|安装教程
- 新手建议学php吗,关于PHP新手学习的一些指导和建议,新手来我的
- CodeBlcoks插件
- css cursor url用法格式详解
- css 弹性盒子200304
- vue 多页面应用例子_【微服务】137:Vue之生命周期钩子
- K均值算法(K-means)
- insist fortress g55 机械键盘得救了
- Date.getyear()、Date.getMonth()、Date.getDay() 已经作废,其他解决办法
- 详细解释:Epoch、batch_size批处理大小、迭代次数之间的关系
- 遗传编程(GA,genetic programming)算法初探,以及用遗传编程自动生成符合题解的正则表达式的实践...
- 从零开始学 Python 之环境搭建
- web安全与字体——刘尧博士讲座--PDF安全
- 【转】Jackson之多态反序列化(父类转不同子类)
- QRCode二维码相关资料
- 新手村 - 第三站,认识均线系统
- 生活中要怎么预防马尾神经损伤
- 双一流大学名单--仅供参考
- ARMv8-M蓝牙协议安全增强
- 非搜浏览器扩展插件说明