【结构型】Adapter模式

Adapter模式主要意图是将类或接口转换成客户期望的接口,从而使得原本不兼容、无法在一起工作的接口可以在一起工作。该模式有两种形式的Adapter法,一是继承方式;二是对象关联依赖方式。

继承方式Adapter法,相比之下,耦合性更强些,并且毕竟依赖于静态继承,如果被适配的对象有多个(派生)版本的话,则在运行时,将无法做到动态适配,因此,如果想要切换适配对象,就必需要重新编译链接。该方式的类关系参考如下:

就Adapter的目的来说,Adapter对象在使用目的上与被适配的Adaptee对象本质上是没有什么关系的,因此可以说Adapter对象并不是一个Adaptee对象,Adapter对象仅仅只是需要Adaptee对象的相关功能而已(可以直观理解为:借个道,从你这路过而已)。继承方式的Adapter的编码结构参考如下:

 1 namespace adapter
 2 {
 3     class Target
 4     {
 5     public:
 6         virtual void doSomething() {};
 7         // some code here........(like virtual destructor etc.)
 8
 9     };//class Target
10
11     class Adaptee
12     {
13     public:
14         void doSpecifyWork() { /* some code here........ */ }
15
16     };//class Adaptee
17
18     class Adapter : public Target
19                   , private Adaptee
20     {
21     public:
22         virtual void doSomething() override { Adaptee::doSpecifyWork(); }
23
24     }//class Adapter
25
26 }//namespace adapter

类继承式的Adapter编码结构参考

前面已述继承式的Adapter相对灵活性不强,而且最重要的问题是耦合性变强了,只要被适配对象有变动就需要重新编译链接。对象关联依赖方式相比继承方式更为灵活,并且可以在运行时对于同一系列的Adaptee进行动态适配。就设计而言,我们总是希望优先使用组合方式而非继承。因此,对于Adapter,建议优先考虑关联依赖式。类关系图参考如下:

模式编码结构参考如下:

 1 namespace adapter
 2 {
 3     class Target
 4     {
 5     public:
 6         virtual void doSomething() {};
 7         // some code here........(like virtual destructor etc.)
 8
 9     };//class Target
10
11     class Adaptee
12     {
13     public:
14         void doSpecifyWork() { /* some code here........ */ }
15
16     };//class Adaptee
17
18     class Adapter : public Target
19     {
20     public:
21         virtual void doSomething() override {
22             auto pAdaptee = this->getAdaptee();
23             if (nullptr != pAdaptee) {
24                 pAdaptee->doSpecifyWork();
25             }
26             // some code here........
27         }
28         // some code here........
29
30     private:
31         Adaptee*    getAdaptee() { return m_pAdaptee; }
32
33     private:
34         Adaptee*    m_pAdaptee;
35
36     }//class Adapter
37
38 }//namespace adapter

关联依赖式Adapter编码结构参考

实际上,Adapter可以提高代码的复用性,可以让多个互不相干的功能模块协同工作。但是Adapter时的难易程度与必要性,有时候也是需要斟酌的。如:待适配的以象极期复杂,而且与期望的对象相似度极低,此时,Adapter就比较蛋碎,肯定会花费不少时间与功夫,此时就需要进一步考虑是否真的有这个必要去适配。即:我们在动手前,需要先分析下Adapter的代价。这个算是一个注意点吧。

时间: 2024-10-15 03:22:30

【结构型】Adapter模式的相关文章

设计模式之结构型桥接模式

在系统沿着多个维度变化的同时,又不增加其复杂度并已达到解耦. function changeColor(dom, color, bg) { // 设置元素的字体颜色 dom.style.color = color; // 设置元素的背景颜色 dom.style.background = bg; } var spans = document.getElementsByTagName('span'); spans[0].onmouseover = function() { changeColor(t

JAVA设计模式(10):结构型-组合模式(Composite)

先看看组合模式的定义吧:"将对象组合成树形结构以表示'部分-整体'的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性." /** * 抽象组件 */ public interface Component { void operation(); } /** * 叶子组件 */ interface Leaf extends Component{ } /** * 容器组件 */ interface Composite extends Component{ } public in

设计模式之结构型--代理模式

代理模式(Proxy pattern)核心作用: 通过代理,控制对对象的访问 可以详细控制访问某个(某类)对象的方法,在调用这个方法前做前置处理,调用这个方法后 做后置处理(即:AOP的微观实现) ----AOP(Aspect Oriented Programming面向切面编程)的核心实现机制 --核心角色: 抽象角色: 定义代理角色和真实角色的公共对外方法,(一个接口,真实角色和代理角色都要去实现这个接口) 真实角色 实现抽象角色,定义真实角色所要实现的业务逻辑供代理角色调用 代理角色 实现

设计模式-结构型-组合模式

组合模式(Composite): 定义: 组合模式又叫部分整体模式,它是一种将对象组合成树状的层次结构模式,用来表示"部分-整体"的关系,使用户对单个对象和组合对象具有一致的访问性. 组合模式的角色: 1)抽象构建(Component):它的主要作用是为树叶构件和树枝构件声明公共接口,并实现它们的默认行为.在透明式的组合模式中抽象构件还声明访问和管理子类的接口:在安全式的组合模式中不声明访问和管理子类的接口,管理工作由树枝构件完成. 2)树叶构件(Leaf):是组合中的叶节点对象,它没

结构型模式之适配器

结构型模式主要讲述如何组合类和对象以获取更大功能的结构,同样,按照模式的主要用途,结构型模式也分为两个层次: 1.结构型类模式,采用继承机制来组合接口,java没有多继承功能,但是可以实现(implements)多个接口,实现了多个父接口的类便拥有了父接口的功能,GOF给出的结构型类模式只有一个,那就是Adapter(适配器)模式,适配器模式的实现还可以用对象模式,一会儿会给出例子. 2.结构型对象模式,该类型的模式不是对接口进行组合,而是描述如何对一些对象进行组合,从而实现一些新功能.因为它可

C#设计模式之十三代理模式(Proxy)【结构型】

一.引言 今天我们要讲[结构型]设计模式的第七个模式,也是"结构型"设计模式中的最后一个模式,该模式是[代理模式],英文名称是:Proxy Pattern.还是老套路,先从名字上来看看."代理"可以理解为"代替",代替"主人"做一些事情,为什么需要"代理",是因为某些原因(比如:安全方面的原因),不想让"主人"直接面对这些繁琐.复杂的问题,但是这些事情是经"主人"同意

C#设计模式之十二代理模式(Proxy Pattern)【结构型】

原文:C#设计模式之十二代理模式(Proxy Pattern)[结构型] 一.引言 今天我们要讲[结构型]设计模式的第七个模式,也是"结构型"设计模式中的最后一个模式,该模式是[代理模式],英文名称是:Proxy Pattern.还是老套路,先从名字上来看看."代理"可以理解为"代替",代替"主人"做一些事情,为什么需要"代理",是因为某些原因(比如:安全方面的原因),不想让"主人"直接

设计模式06: Adapter 适配器模式(结构型模式)

Adapter 适配器模式(结构型模式) 适配(转换)的概念无处不在:电源转接头.电源适配器.水管转接头... 动机(Motivation)在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象不能满足的.如何应对这种“迁移的变化”?如何既能够利用现有对象的良好表现,同时又能满足新的应用环境所要求的接口? 意图(Intent)将一个类的接口转换成客户希望的另一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一

设计模式(七):Adapter 适配器模式 -- 结构型模式

1. 概述: 接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题.程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相关库的发展和进化.  例子1:iphone4,你即可以使用UBS接口连接电脑来充电,假如只有iphone没有电脑,怎么办呢?苹果提供了iphone电源适配器.可以使用这个电源适配器充电.这个iphone的电源适配器就是类似我们说的适配器模式.(电源适配器就是把电源变成需要的电压,也就是适配器的作用是使得一个东西适合另外一个东西.)  例子2:最典型的例

NET设计模式 第三部分 结构型模式(7):适配器模式(Adapter Pattern)

适配器模式(Adapter Pattern) ——.NET设计模式系列之八 Terrylee,2006年2月 概述 在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的.那么如何应对这种“迁移的变化”?如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口?这就是本文要说的Adapter 模式. 意图 将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可