设计模式——适配器(Adapter)模式
- 概述
什么是适配器?在我们生活中的适配器比如插头转换器(中标转美标)、USB接口转换器(type-c转苹果),电脑电源适配器(交流电转低电压直流)等。像这种将两者有差异的东西通过适配器使他们成为相互适合的东西。在程序世界中,经常存在现有的程序无法直接使用,需要做适当的变换后才能使用的情况,这种用于填补“现有程序”和“所需程序”之间差异的设计模式就是适配器(Adapter)模式。适配器模式有类适配器模式和对象适配器模式两种,前者使用继承,后者使用组合,所以后者比较灵活,推荐使用。下面通过实例对这两种模式的学习做一个笔记。
- 实例
类适配器模式
Banner类:代表现在的实际情况
/**
* 注意:两种实现方式都是用的这个Banner类
* 推荐使用对象适配器方式
*/
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+"*");
}
}
PrintForClass接口:代表是“需求”的接口
public interface PrintForClass {
public abstract void printWeak();
public abstract void printStrong();
}
PrintBannerForClass类:扮演适配的角色。
实现目标接口(PrintForClass)达到适配目的,而继承被适配者类(Banner)达到通过调用被适配者里的方法来实现目标接口的功能。
public class PrintBannerForClass extends Banner implements PrintForClass{
public PrintBannerForClass(String string) {
super(string);
}
//实现PrintForClass中的方法
@Override
public void printWeak() {
super.showWithParen();
}
@Override
public void printStrong() {
super.showWithAster();
}
}
Main类:通过扮演适配器角色的PrintBannerForClass类来显示字符串。
注意:这里我们将PrintBannerForClass类的实例保存在了PrintForClass类型的变量中。在这个类中,我们是使用PrintForClass接口来进行编程的。对Main类来说,Banner类、showWithParen()、showWithAster()方法被完全隐藏起来了。这就好像电脑电源适配器(交流电转低电压直流),电脑使用的是直流电,而它并不关心这个直流电是怎么来的。
public class Main {
public static void main(String[] args) {
//使用类适配器模式(继承)
PrintForClass p = new PrintBannerForClass("Hello World!");
p.printWeak();
p.printStrong();
}
}
对象适配器模式(推荐)
对象适配器模式就是采用一种“委托”的方式将某个方法中的实际处理交给其它实例来处理。在下面的例子中就是当PrintBannerForObject类中的printWeak()方法被调用的时候,并不是PrintBannerForObject类自己进行处理,而是将处理交给了Banner类的实例的showWithParen()方法。
Banner类:和上面的Banner类一样
PrintForObject类:不同于使用类适配器模式,这里使用的类,而类适配模式是使用的接口。
public abstract class PrintForObject {
public abstract void printWeak();
public abstract void printStrong();
}
PrintBannerForObject类:这个类中的banner字段保存了Banner的实例。然后printWeak()方法和printStrong()方法通过这个实例对象调用Banner类中的方法实现具体的功能。
public class PrintBannerForObject extends PrintForObject {
private Banner banner;
public PrintBannerForObject(String string) {
this.banner = new Banner(string);
}
//实现PrintForObject中的方法
@Override
public void printWeak() {
banner.showWithParen();
}
@Override
public void printStrong() {
banner.showWithAster();
}
}
- 完整代码
请移步:https://github.com/yyc007/DesignPatterns/
- 小结
适配器模式就是将一个类的接口转换成另一种接口,让原本接口不兼容的类可以兼容。
从用户的角度看不到被适配者,是解耦的;
用户调用适配器转化出来的目标接口方法;
适配器再调用被适配者的相关接口方法;
用户收到反馈结果,感觉只是和目标接口交互。
设计模式——适配器(Adapter)模式的更多相关文章
- 设计模式--适配器(Adapter)模式
今天学习另一个设计模式,适配器(Adapter)模式,这是一个共同方向,但有特殊要求,就应用到此设计模式.写到这里,想起很久以前,有写过一篇<ASP.NET的适配器设计模式(Adapter)&g ...
- 2、适配器 adapter 模式 加个"适配器" 以便于复用 结构型设计模式
1.什么是适配器模式? 适配器如同一个常见的变压器,也如同电脑的变压器和插线板之间的电源连接线,他们虽然都是3相的,但是电脑后面的插孔却不能直接插到插线板上. 如果想让额定工作电压是直流12伏特的笔记 ...
- 【原】模式之-适配器Adapter模式
适配器Adapter模式 适配器模式(Adapter Pattern)把一个类的接口变换成客户端所期待的的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 模式所涉及的角色有 ...
- 设计模式C++描述----06.适配器(Adapter)模式
一. 定义 适配器模式将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. Adapter 模式的两种类别:类模式和对象模式. 二. 举例说明 实际中 ...
- 设计模式之Adapter模式
说起Adapter,STL里的stack和queue都是adapter,底层是deque,隐藏了deque的一些接口,使得其可以达到FIFO是queue,LIFO是stack. The STL sta ...
- Objective-C设计模式——适配器Adapter(接口适配)
适配器模式 适配器模式通俗来讲,其实就是对客户端添加新的类但却不修改客户端和新的类的接口.此时我们需要自己来实现适配,在适配器模式中有Target对象,即客户端所需要的接口对象,Adaptee对象,即 ...
- java演示适配器(adapter)模式
为什么要使用模式: 模式是一种做事的一种方法,也即实现某个目标的途径,或者技术. adapter模式的宗旨就是,保留现有类所提供的服务,向客户提供接口,以满足客户的需求. 类适配器:客户端定义了接口并 ...
- Java 实现适配器(Adapter)模式
平时我们会常常碰到这种情况,有了两个现成的类,它们之间没有什么联系.可是我们如今既想用当中一个类的方法.同一时候也想用另外一个类的方法.有一个解决方法是.改动它们各自的接口.可是这是我们最不愿意看到的 ...
- 适配器(Adapter)模式
适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 适配器模式的一些其他名称:变压器模式.转换器模式.包装(Wrapper)模式.适 ...
- 漫谈设计模式(一):代理(Proxy)模式与适配器(Adapter)模式对比
1.前言 为什么要将代理模式与适配器模式放在一起来说呢?因为它们有许多的共同点,当然也有一些不同的地方.首先两者都是属于结构型模式.结构型模型是这样定义的: 结构型模式涉及到如何组合类和类以获得更大的 ...
随机推荐
- php 计算gps坐标 距离
在计算机或GPS上经纬度经常用度.分.秒和度.度.分.分.秒.秒的混合方式进行表示,度.分.秒间的进 制是60进制,度.度.分.分. 秒.秒的进制是100进制,换算时一定要注意.可以近似地认为每个纬度 ...
- python中的抽象方法
python中的抽象方法 父类要限制1.子类必须有父类的方法2.子类实现的方法必须跟父类的方法的名字一样 import abc class A(metaclass=abc.ABCMeta): @abc ...
- Python之配置文件读写
ConfigParser模块 一.创建配置文件 在D盘建立一个配置文件,名字为:test.ini 内容如下: [baseconf] host=127.0.0.1 port=3306 user=root ...
- SSO之CAS基础及应用视频教程(1)
CAS介绍 CAS = Central Authentication Service,中央认证服务.CAS 是 Yale 大学发起的一个开源项目,能够为 Web 应用系统或者非Web应用系统提 ...
- windows server 2008 r2 IIS 6 元数据库与IIS 6 配置的兼容性 解决方案
1 菜单-管理工具-服务器管理 2 添加角色服务 3 选中 IIS6 管理兼容性 4 安装完成 5 在IIS上新建一个相应端口的网站 6重新加载项目,OK
- TensorFlow学习笔记(二)-- MNIST机器学习入门程序学习
此程序被称为TF的 Hello World,19行代码,给人感觉很简单.第一遍看的时候,不到半个小时,就把程序看完了.感觉有点囫囵吞枣的意思,没理解透彻.现在回过头来看,感觉还可以从中学到更多东西. ...
- 安装CentOS 7 文字版
下载镜像 http://mirrors.163.com/ CentOS 7.4 http://mirrors.163.com/centos/7.4.1708/isos/x86_64/ 选择 CentO ...
- PAT 1033 To Fill or Not to Fill[dp]
1033 To Fill or Not to Fill(25 分) With highways available, driving a car from Hangzhou to any other ...
- 20165324《Java程序设计》第四周
学号 2016-2017-2 <Java程序设计>第四周学习总结 教材学习内容总结 第五章:子类与继承 子类的定义:class 子类名 extends 父类名 { ... } 子类继承性: ...
- java通过url抓取网页数据
在很多行业中,要对行业数据进行分类汇总,及时分析行业数据,对于公司未来的发展,有很好的参照和横向对比.所以,在实际工作,我们可能要遇到数据采集这个概念,数据采集的最终目的就是要获得数据,提取有用的数据 ...