设计模式-适配器模式(Adapter Pattern)
本文由@呆代待殆原创,转载请注明出处:http://www.cnblogs.com/coffeeSS/
适配器模式简介
适配器模式的作用就如同现实生活中转接头的作用一样,现实生活中我们会用USB转接头把手机插到家用两孔或者三孔插座上充电,这就是一个适配的模式,在编程中我们可能会遇到现有的系统所需要的接口和新加入的类实现的接口不一样的情况,这时我们可以写一个适配器类,作为二者之间的转换器使用,从这个特点我们看到这种模式一般不在系统设计阶段使用,而是在后期扩展系统时使用。抽象的表示如下图,来自《Head First》的插图。
aaarticlea/png;base64,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" alt="" />
aaarticlea/png;base64,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" alt="" />
适配器模式的定义和基本结构
定义:将一个类的接口转化成客户期望的另一种接口,适配器可以让原本接口不兼容的类一起工作。
结构:适配器模式的实现有两种结构,类适配器(class adapter)与对象适配器(object adapter)。我们先分别介绍这两种实现方式,然后再简单介绍下两者的差别(结构体均来自《Head First》)。
对象适配器的结构:
aaarticlea/png;base64,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" alt="" />
Target:被客户端调用的类需要遵循的标准接口。
Client:客户端程序,调用的标准接口是Target接口。
Adaptee:一个接口对客户端来说是未知的类,是被适配器适配的对象。
Adapter:适配器类,是将被适配的类转换成客户端需要的Target接口类型的类,从图中可以看出,adapter类与adaptee的关联方式是组合。
一个简单的实例(java)
我们就用插座的例子来说明,假如有一个二孔插座(client类)和一个USB插头(adaptee类),很明显二孔插座的标准接口是TwoHole接口,USB用不了,所以我们要写一个USBToTHAdapter(adapter类)的类来把USB强插上去,道理很简单,下面给出实现。
首先是插座的接口类,TwoHole,只有一个方法,报告插入的插口是什么类型。
public interface TwoHole {
public abstract void info();
}
然后是插座,MySocket类,会报告插进来的插口的类型。
public class MySocket {
private TwoHole th;
public MySocket(TwoHole th){
this.th=th;
}
public void status(){
System.out.print("插入了 ");
th.info();
}
}
USB类,一个不同于TwoHole接口的报告自己是什么类型的方法。
public class USB {
public void putName(){
System.out.println("The usb");
}
}
USBToTHAdapter类,适配二孔插座MySocket类和USB类。
public class USBToTHAdapter implements TwoHole {
private USB usb;
public USBToTHAdapter(USB usb){
this.usb=usb;
}
@Override
public void info() {
usb.putName();
}
}
最后是测试代码。
public class Test {
public static void main(String[] args) {
MySocket s=new MySocket(new USBToTHAdapter(new USB()));
s.status();
}
}
输出如下:
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAk0AAAAZCAIAAACjGI3HAAACXklEQVR4nO3cy3mrMBBA4alLBVEP1bB1ITSRDpQFNh49GSHFsfH5VzEImbs6nwS+4gEAuC4JPoiUxgEA8O9+2uU7Vw9ez1kAAE77886JUrkPS+rEwPwPBwB8hfGdOx2ezkoROQBA6m/Xcy/rHJEDAGQN6FxlAfeazvVHbp2diIibO+cZa5lERGRa/vtGAOCDDV7PnX5+tl/edPcNW6P3lCX2tq2ze7POee/9MtE5AOgxuHMRe7dOd846VGXs2Q7dNjoHAFdU6dntdjuznst+PPQunbvvFYqIm9dggueZlh3OaEf0MUk4uV5rTkuQtu2D+m6qBwBNKpHbNHROb13qs8ZNy/TvQ6M755w6o2O2zk4XZp1dQ3GSleLsdOeWSc21FS3oXHBgmdICAwDK6pHLpq74Hsp+RJ/N/h15ReeU/F7gVjZVEFWj3BXLZO3NcefKMwUR3O+TRR0AWNVXctnUHf9+Lj3ry01Kj7fudrYqdq5Uo9I7LMbcHHQumj88lbvX+HIAQNnhdmV6xPo7cW/bt/yMzvW8onLYuWiwTh2dA4A+2c7VD45cz9nj1zMs0ty5zrTEM1c3Ku/D1+dY9i0BoEOatHQnMzo+rHPGJ3YVL+tc+v5HS25U2Pb3Lx9TJfOEFcy9h0LlAMAuW7W6zHsovvz/W6YvquzD6ndWHxB9qVH0nG3viXpANi2Zz/Gg7WL796pL3bzeb2ObOX32F717ye8KAKDHgM55w/6kcUx6Sf+aDwDwzcZ0DgCA90TnAABXRucAAFdG5wAAV9bbOQAA3hmdAwBcGZ0DAFzZic79AnZ64Ge7Yer5AAAAAElFTkSuQmCC" alt="" />
是不是觉得很简单。接下来看类适配器结构,先上图
类适配器的结构
aaarticlea/png;base64,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" alt="" />
注意区别,这里并没有使用组合的方式来适配adaptee而是用了多继承的方式,其他解释同上。下面同样给出代码样例,由于java不支持多继承,所以用C++来写,例子同上(因为代码很简单我就不分写.h和.cpp文件了)。
一个简单的实例(C++)
#include<iostream>
using std::cout;
using std::endl; class TwoHole{
public:
virtual void info(){cout << "null"<<endl;}
}; class MySocket{
private:
TwoHole* th;
public:
MySocket(TwoHole* th){ this->th = th; }
void status();
}; void MySocket::status(){
cout << "插入了";
th->info();
} class USB{
public:
void putName(){ cout << "The usb"<<endl; }
}; class USBToTHAdapter :public USB, public TwoHole{
public:
void info(){ putName(); }
}; int main(){
MySocket s = MySocket(new USBToTHAdapter());
s.status();
return ;
}
输出输出如下:
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAP8AAABECAIAAADBZ3QrAAADxUlEQVR4nO2Y2ZHjMAxElX9UjGNT2CT2Z8ulIcBm89Ax5fe+PBLQgIQGy57jL8C3cjzdAMBj4H74XnA/fC/HH4Bv5QCA4ziOUsq6woRIkWxpDKBD12Smufea9bwGAFdROSw9huekVlrC93AHLZ/NfZlZ6+W/iGip9TVJJz7IO7uC2kzx7pzgYktdfdwP2zjPpmWv1oZEqelJD+W21vWFPntnV/Cf1mxGZ/YZ89ywN7pf7Kq/ybpc64qInKgLlxMtW83JP/irD6NtbHF/hQ6YLlddEcrdruBJotE/n6uwro4Z2W1jLrjy1tCfo+VaL611d64uXEs8qNLP8c+o4wc7nUwEr3h0tJxv6JW6cBWfGay7f8uA73F/ZK5cdUXI4v43crbF+WIcYdco6a2vcn+8VdU1c+FuytrZr00w1MY97vdbqnRaUkN1V9qA/ay4X09x3dBDwd1TtgTMcmmuqawT4WGm3e9M0Z/3De4/fnrRrBVzh5SrFKz/LroHVWuovv529wOsEm0t/GeGbWkD4A6mT/Tt4H4AAAB4EPOn6lziXPC6SDdSB5i/i4bgK99jLI6zFbNux6GfwkORKwHnQv4/DHQA7n+SaoQCnevfijFOrSrxE1ZlaYWVh43prVvdXFFdi8BmnEmbuStmGqorGujGVy2lCk5jVWT5uck6d6hnuA/TvkPn1pDLR93f8rHfhqCVHuvqNsRu4P434kylMsTnQ3rd1Nd1tVl9++orOjK1eysx5qZNtnqGq6he96iZjoWvLmLSF40/+iytNeH+GJAKiueN4nATK6/7PNohQXHIDS2PuaWp+JBCvFXkqZE+ackWRgTA5ehJaz9Vk0uzYnr5eXa2/CdKa5eIu121qrdupNmS1sT0j+FMsXUx3RydWHrnnGOFiYWJWV013VuqIBqOncTPcDfpYLQVPlfi2GKkWddJMWPMoiXbQz83/bP7UDES6z+J41fTqb71fU0Rc3aS2NWWeOpX0VWlX9lXuDk2Fhs2+4fNOEeR49Q4uUvdr91mFvUtKKo4L1CA158kWtY/jVqr4pxh0+4vP0/QI1uGrnhMNKtXkdOmH6rYfZkvzP0dRPenMa1coanf3Rb3i4viQeL+DFVPH81PdNTSXK3/ttxfgDnFIafGddqyUTGgKxsDzs2IHUhl43O16urEtBmzDbiWOA8xufQk05rxYjHQ7TnB3ZaEjhkv0p0GDhbgcdIx62Bz3r7s1WwpPSfSfVe4HwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA3s8/7j9UyPpuFH0AAAAASUVORK5CYII=" alt="" />
关于类适配器和对象适配器之间的区别:
1,类适配器使用了多继承,而对象适配器使用的是组合。
2,类适配器由于使用了继承,理论上效率会比对象适配器快一丢丢,而且能对被适配者进行方便的重写。
3,对象适配器,使用的是组合的方式,能适配被适配对象和其子类,灵活性更好(前提是子类对象不加入新的行为)。
其实,说白了就是一个具有了组合带来的优点,一个具有了继承带来的优点。具体使用哪个任凭大家喜欢吧,楼主更倾向于组合方式,因为实在不喜欢多继承_(:зゝ∠)_。
适配器模式和装饰者模式的区别
两者都用到了包装这一方法,所以看上去会有点相似,但是他们两种设计模式的目的是完全不一样的。
适配器模式的目的是为了改变接口,把任意接口改变成我们需要的接口,重点在改变。
装饰者模式的目的是为了增加特性或者功能,是为了丰富被装饰者,重点在与 增加。
适配器模式到此结束♪(^∇^*)。
参考资料:《Head First 设计模式》。
设计模式-适配器模式(Adapter Pattern)的更多相关文章
- 设计模式 - 适配器模式(adapter pattern) 具体解释
适配器模式(adapter pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 适配器模式(adapter pattern): 将一个类的接 ...
- 设计模式 - 适配器模式(adapter pattern) 枚举器和迭代器 具体解释
适配器模式(adapter pattern) 枚举器和迭代器 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考适配器模式(adapter patter ...
- C#设计模式——适配器模式(Adapter Pattern)
一.概述在软件开发中,常常会想要复用一个已经存在的组件,但该组件的接口却与我们的需要不相符,这时我们可以创建一个适配器,在需复用的组件的接口和我们需要的接口间进行转换,从而能够正常的使用需复用的组件. ...
- 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern)
原文:乐在其中设计模式(C#) - 适配器模式(Adapter Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 适配器模式(Adapter Pattern) 作者:webabc ...
- 怎样让孩子爱上设计模式 —— 7.适配器模式(Adapter Pattern)
怎样让孩子爱上设计模式 -- 7.适配器模式(Adapter Pattern) 标签: 设计模式初涉 概念相关 定义: 适配器模式把一个类的接口变换成client所期待的还有一种接口,从而 使原本因接 ...
- 设计模式系列之适配器模式(Adapter Pattern)——不兼容结构的协调
模式概述 模式定义 模式结构图 模式伪代码 类适配器,双向适配器,缺省适配器 类适配器 双向适配器 缺省适配器 模式应用 模式在JDK中的应用 模式在开源项目中的应用 模式总结 主要优点 主要缺点 适 ...
- 二十四种设计模式:适配器模式(Adapter Pattern)
适配器模式(Adapter Pattern) 介绍将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作.示例有一个Message实体类 ...
- 【设计模式】适配器模式 Adapter Pattern
适配器模式在软件开发界使用及其广泛,在工业界,现实中也是屡见不鲜.比如手机充电器,笔记本充电器,广播接收器,电视接收器等等.都是适配器. 适配器主要作用是让本来不兼容的两个事物兼容和谐的一起工作.比如 ...
- 设计模式(七): 通过转接头来观察"适配器模式"(Adapter Pattern)
在前面一篇博客中介绍了“命令模式”(Command Pattern),今天博客的主题是“适配器模式”(Adapter Pattern).适配器模式用处还是比较多的,如果你对“适配器模式”理解呢,那么自 ...
- 适配器模式(Adapter Pattern)--设计模式
在生活中,想用苹果充电线给安卓的手机充电时,因为两者的接口不一样,会导致充电口无法进行匹配, 这时候,就需要适配器,将安卓的充电口转化为苹果的接口,这样就可以充电啦.已有的类与新的接口不兼容问题是很普 ...
随机推荐
- Windows下基于python3使用word2vec训练中文维基百科语料(一)
在进行自然语言处理之前,首先需要一个语料,这里选择维基百科中文语料,由于维基百科是 .xml.bz2文件,所以要将其转换成.txt文件,下面就是相关步骤: 步骤一:下载维基百科中文语料 https:/ ...
- selenium在爬虫领域的初涉(自动打开网站爬取信息)
selenium简介 Selenium 是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.这个工具的主要功能包括:测试与浏览器的兼容性--测试你的应 ...
- perl6中的hash定义(1)
,,,); say %hash; , b => ); say %hash2; my %hash3 = (:name('root'), :host('localost')); say %hash3 ...
- linux===启动sdk manager下载配置sdk的时候报错的解决办法
当启动sdk manager下载配置sdk的时候,报错如下: botoo@botoo-virtual-machine:/opt/android-sdk-linux/tools$ sudo ./and ...
- Ubuntu终端里面显示路径名称太长,怎么设置变短【转】
转自:http://blog.csdn.net/id19870510/article/details/8276914 $: sudo vi ~/.bashrc 这个文件记录了用户终端配置 找到 if ...
- UML基础
UML基础系列:类图 类图描述系统中类的静态结构,它不仅定义系统中的类,描述类之间的联系,如关联.依赖.聚合等,还包括类的内部结构(类的属性和操作).类图描述的是静态关系,在系统的整个生命周期中都 ...
- 怎么快速入门一个老的java项目
作者:eilen著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 1.有文档肯定先看文档,先看设计文档,产品的.技术的设计文档,接口文档写的好的可以看看,要是写的不好不着急看. 2 ...
- udp调用connect有什么作用(转)
原文链接如下: http://blog.csdn.net/wannew/article/details/18218619 整理一下.1:UDP中可以使用connect系统调用 2:UDP中connec ...
- ajax登录请求,无法跳转
没有用form提交数据,用的ajax提交.服务器显示已经登录成功,并且返回了成功代码OK.却无法进行跳转: js代码: $("input[type='submit']").on(& ...
- linux命令(41):watch命令
watch是一个非常实用的命令,基本所有的Linux发行版都带有这个小工具,如同名字一样,watch可以帮你监测一个命令的运行结果,省得你一遍遍的手动运行.在Linux下,watch是周期性的执行下个 ...