1 概念
适配器模式把一个类的接口变换成客户端期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的俩个类能够在一起
工作。
这很像变压器(adapter),变压器把一种电压变换成另一种电压,把美国的电器拿回中国大陆来用的时候,用户就面临电压不同的问题美国的生活用电电压是110V,而中国的电压是220V。如果要在中国实用在美国的电器,就必须有一个能把220V电压转换成110V电压的变压器。而这正像本模式所做的事,因而次模式也常常被称为变压器模式。
2 适配器模式的分类
适配器模式有类的适配器模式和对象的适配模式2种不同的形式。
3 类的适配器模式
类的适配器模式把适配的类的api转换成为目标类的api
模式所涉及的角色有:
-
目标(target)角色:这就是所期待的接口,注意由于这里讨论的是类的适配器模式,目标不可以是类
Tsocket(插座)是一个接口,默认只能提供220V的电压,但是我们希望它还能提供110V的电压供美国电器使用、
-
源(source)角色:现有需要适配的类
Appliance(美国电器)是一个类,只能使用110V的电压,但是220V的电压是不能使用的,如果非要给美国电器加上220v的电压使用,可能直接就炸了。O(∩_∩)O
- 适配器(adapter)角色:适配器类是本模式的核心。适配器把源接口转换成目标接口。显然这一角色不可是接口,而必须是类。
Adapter(变压器)是一个类,它继承了Appliance(美国电器)类,并实现了Tsocket (插座)接口它可以将把110V的电压变到220V,300V,400V,牛逼的可以到10000V
4 类的适配器模式demo
4.1 定义Tsocket接口
package com.liuyu.target; /** * Tsocket(插座)对象作为定为一个接口 * target:既可以提供110v的电压,又可以提供220v的电压 * @author Mrliu * */ publicinterfaceTsocket{ publicvoid using110V(); publicvoid using220V(); }
4.2 新建一个Appliace对象
package com.liuyu.source; /** * 美国电器只能使用110V的电压工作 * @author Mrliu * */ publicclassAppliance{ publicvoid workingIn110V(){ System.out.println("=== Appliance is working in 110v ==="); } }
4.3 新建一个adapter类,继承Appliance对象,还实现了Tsocket接口
package com.liuyu.adapter; import com.liuyu.source.Appliance; import com.liuyu.target.Tsocket; /** * Adapter继承了Applance类,又实现了Tsocket接口,适配后既可以提供110V的电压,又可以提供220V的电压 * @author Mrliu * */ publicclassAdapterextendsApplianceimplementsTsocket{ @Override publicvoid using110V(){ this.workingIn110V();//调用Appliance的using110V()方法 } @Override publicvoid using220V(){ System.out.println("====经过adapter变压后,美国电器可以正常运转了 ==="); } }
4.4 主函数
import com.liuyu.adapter.Adapter; publicclassTestAdapter{ publicstaticvoid main(String[] args ){ Adapter adapter =newAdapter(); adapter.using110V(); adapter.using220V(); } }
运行结果:
5 对象适配器模式
使用一个具体类把源(Appliance-美国电器)适配到目标(Tsocket-插座)中,这样一来如果适配Appliance(美国电器)的子类,美国电器可能有带三孔插座的、带二孔插座的,这次可能适配的带二孔的,下次就要适配带三孔的。这样就很不方便了,这个时候可以把美国电器的父类作为adapter的成员变量来处理。
在类的适配器模式中,adapter是继承Appliance类的,在对象的适配器模式中,为了能适配Appliance的子类,appliance没有
作为adapter的父类来处理,而是作为adapter的成员类来处理的。现在adapter的源码如下所示:
package com.liuyu.adapter; import com.liuyu.source.Appliance; import com.liuyu.target.Tsocket; /** * Adapter继承了Applance类,又实现了Tsocket接口,适配后既可以提供110V的电压,又可以提供220V的电压 * @author Mrliu * */ publicclassAdapterimplementsTsocket{ privateApplianceappliance; //电器的父类,这里偷下懒,意思意思一下,就当做是所有美国电器的父类 publicAppliance getAppliance(){ return appliance; } publicvoid setAppliance(Appliance appliance){ this.appliance = appliance; } @Override publicvoid using110V(){ appliance.workingIn110V();//调用Appliance的using110V()方法 } @Override publicvoid using220V(){ System.out.println("====经过adapter变压后,美国电器可以正常运转了 ==="); } }
6 适配器模式的效果
(1) 一个适配器可以把多种不同的源适配到同一个目标。换言之,同一个适配器可以把源类和它的子类适配到目标接口中
(2) 与类的适配器模式相比,要置换源类的方法就不容易。如果一定要置换掉源类的一个或多个方法,就只好先做一个 源类的子类,将源类的方法置换掉,然后再把源类的子类当做真正的源类进行适配。
(3) 虽然想要置换源类的方法不容易,但是要想增加一些新的方法则方便的很,而且新增加的方法可同时适用于所有的源。
7 适配器模式的使用场景
(1) 系统需要使用现有的类,而此类的接口不符合系统的需要。
(2) 想要建立一个可以重复使用的类,用于与一些彼此之间没有太大关联的一些类,包括一些可能在将来引进的类一起工作。
(3)(对对象的适配器模式而言)在设计里,需要改变多个已有子类的接口,如果使用类的适配器模式,就要对每一个子类做一个适配类,而这不太实际。
相关推荐
NULL 博文链接:https://lizhao6210-126-com.iteye.com/blog/1753041
浅析Java设计模式【2】——适配器
设计模式——适配器模式 适配器模式(Adapter Pattern):将一个类的接口转换成为客户希望的另外一个接口.Adapter Pattern使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 应用场景:系统数据和
JAVA设计模式总结之23种设计模式 一:设计模式之六大原则 总原则:开闭原则(Open Close Principle) 开闭原则就是说对扩展开放,对修改关闭。 1.Abstract Factory(抽象工厂模式) 2.Adapter(适配器模式)......
走进设计模式之——适配器模式 (Adapter) 对应代码
书名: 设计模式可复用面向对象软件的基础 英文原书名: Design Patterns:Elements of Reusable Object-Oriented software 作者: Erich Gamma 等 译者: 李英军 马晓星 蔡敏 刘建中 书号: 7-111-07575-7 页码: 254 定价...
对象的克隆——原型模式,复杂对象的组装与创建——建造者模式,不兼容结构的协调——适配器模式,处理多维度变化——桥接模式,树形结构的处理——组合模式,扩展系统功能——装饰模式,深入浅出外观模式,实现对象...
C#设计模式(23种设计模式) 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4. 工厂方法模式(Factory Method) 5. 原型模式(Prototype) 结构型: 6. 适配器...
pathtodriver——适配器驱动程序的寻找路径,“”表示在当前目录下(*.BGI) enum graphics_driver{DETECT,CGA,MCGA,EGA,EGA64,………,VGA,PC3270}; DETECT——自动检测所用显示适配器的类型,将相应的驱动程序装入,...
七个结构型模式 七个结构型模式 适配器模式-Adapter Pattern 不兼容结构的协调——适配器模式(一) 不兼容结构的协调——适配器模式(二) 不兼容结构的协调——适配器模式(三) 不兼容结构的协调——适配器模式...
java和设计模式ppt包含工厂模式、建造模式、原始模型模式、单例模式、结构模式、适配器、桥梁模式、合成模式、装饰模式、门面模式、享元模式、代理模式、行为模式、解释器模式、迭代子模式、调停者模式、备忘录模式...
目录: 前 言 第一部分 大旗不挥,谁敢冲锋——热身篇 第1章 单一职责原则 1.1 我是“牛”类,我可以担任多职吗 1.2 绝杀技,打破你的传统思维 1.3 我单纯,所以我快乐 1.4 最佳实践 ...附录:23个设计模式
4.1AdapterPattern(适配器模式) 96 4.1.1定义 96 4.1.2现实中的实例——电脑电源适配器 97 4.1.3C#实例——化学数据银行 98 4.1.4Java实例——清洁系统 102 4.1.5优势和缺陷 104 4.1.6应用情景 104 4.2...
4.1AdapterPattern(适配器模式) 96 4.1.1定义 96 4.1.2现实中的实例——电脑电源适配器 97 4.1.3C#实例——化学数据银行 98 4.1.4Java实例——清洁系统 102 4.1.5优势和缺陷 104 4.1.6应用情景 104 4.2...
适配器模式(Adapter Pattern)桥接模式(Bridge Pattern)过滤器模式(Filter、Criteria Pattern)组合模式(Composite Pattern)装饰器模式(Decorator Pattern)外观模式(Facade Pattern)享元模式(Flyweight ...
1.2 Smalltalk MVC中的设计模式 1.3 描述设计模式 1.4 设计模式的编目 1.5 组织编目 1.6 设计模式怎样解决设计问题 1.7 怎样选择设计模式 1.8 怎样使用设计模式 第二章 实例研究:设计一个文档编辑器 2.1 设计问题...
结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。 行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、...