【结构型】Adapter模式
Adapter模式主要意图是将类或接口转换成客户期望的接口,从而使得原本不兼容、无法在一起工作的接口可以在一起工作。该模式有两种形式的Adapter法,一是继承方式;二是对象关联依赖方式。
继承方式Adapter法,相比之下,耦合性更强些,并且毕竟依赖于静态继承,如果被适配的对象有多个(派生)版本的话,则在运行时,将无法做到动态适配,因此,如果想要切换适配对象,就必需要重新编译链接。该方式的类关系参考如下:

就Adapter的目的来说,Adapter对象在使用目的上与被适配的Adaptee对象本质上是没有什么关系的,因此可以说Adapter对象并不是一个Adaptee对象,Adapter对象仅仅只是需要Adaptee对象的相关功能而已(可以直观理解为:借个道,从你这路过而已)。继承方式的Adapter的编码结构参考如下:
namespace adapter
{
class Target
{
public:
virtual void doSomething() {};
// some code here........(like virtual destructor etc.) };//class Target class Adaptee
{
public:
void doSpecifyWork() { /* some code here........ */ } };//class Adaptee class Adapter : public Target
, private Adaptee
{
public:
virtual void doSomething() override { Adaptee::doSpecifyWork(); } }//class Adapter }//namespace adapter
类继承式的Adapter编码结构参考
前面已述继承式的Adapter相对灵活性不强,而且最重要的问题是耦合性变强了,只要被适配对象有变动就需要重新编译链接。对象关联依赖方式相比继承方式更为灵活,并且可以在运行时对于同一系列的Adaptee进行动态适配。就设计而言,我们总是希望优先使用组合方式而非继承。因此,对于Adapter,建议优先考虑关联依赖式。类关系图参考如下:

模式编码结构参考如下:
namespace adapter
{
class Target
{
public:
virtual void doSomething() {};
// some code here........(like virtual destructor etc.) };//class Target class Adaptee
{
public:
void doSpecifyWork() { /* some code here........ */ } };//class Adaptee class Adapter : public Target
{
public:
virtual void doSomething() override {
auto pAdaptee = this->getAdaptee();
if (nullptr != pAdaptee) {
pAdaptee->doSpecifyWork();
}
// some code here........
}
// some code here........ private:
Adaptee* getAdaptee() { return m_pAdaptee; } private:
Adaptee* m_pAdaptee; }//class Adapter }//namespace adapter
关联依赖式Adapter编码结构参考
实际上,Adapter可以提高代码的复用性,可以让多个互不相干的功能模块协同工作。但是Adapter时的难易程度与必要性,有时候也是需要斟酌的。如:待适配的以象极期复杂,而且与期望的对象相似度极低,此时,Adapter就比较蛋碎,肯定会花费不少时间与功夫,此时就需要进一步考虑是否真的有这个必要去适配。即:我们在动手前,需要先分析下Adapter的代价。这个算是一个注意点吧。
【结构型】Adapter模式的更多相关文章
- JAVA设计模式(09):结构型-代理模式(Proxy)
代理模式是经常使用的结构型设计模式之中的一个,当无法直接訪问某个对象或訪问某个对象存在困难时能够通过一个代理对象来间接訪问,为了保证client使用的透明性,所訪问的真实对象与代理对象须要实现同样的接 ...
- 结构型--代理模式(Proxy)
一.代理模式是什么? 代理模式属于GOF23设计模式中结构型中的设计模式,通过代理对象来屏蔽(部分或者屏蔽)对真实对象的直接访问,下图为UML图: 在代理模式中组件包括:抽象角色接口.代理角色类.真实 ...
- 结构型---组合模式(Composite Pattern)
组合模式的定义 组合模式允许你将对象组合成树形结构来表现”部分-整体“的层次结构,使得客户以一致的方式处理单个对象以及对象的组合. 组合模式实现的最关键的地方是——简单对象和复合对象必须实现相同的接口 ...
- 结构型---外观模式(Facade Pattern)
定义 外观模式提供了一个统一的接口,用来访问子系统中的一群接口.外观定义了一个高层接口,让子系统更容易使用.使用外观模式时,我们创建了一个统一的类,用来包装子系统中一个或多个复杂的类,客户端可以直接通 ...
- 结构型---桥接模式(Bridge Pattern)
定义 桥接模式即将抽象部分与实现部分脱耦,使它们可以独立变化.桥接模式的目的就是使两者分离,根据面向对象的封装变化的原则,我们可以把实现部分的变化封装到另外一个类中,这样的一个思路也就是桥接模式的实现 ...
- 结构型---代理模式(Proxy Pattern)
代理模式的详细介绍 代理模式按照使用目的可以分为以下几种: 远程(Remote)代理:为一个位于不同的地址空间的对象提供一个局域代表对象.这个不同的地址空间可以是本电脑中,也可以在另一台电脑中.最典型 ...
- 设计模式之美:Structural Patterns(结构型模式)
结构型模式涉及到如何组合类和对象以获得更大的结构. 结构型类模式采用继承机制来组合接口实现. 结构型对象模式不是对接口和实现进行组合,而是描述了如何对一些对象进行组合,从而实现新功能的一些方法. 因为 ...
- C#设计模式之十三代理模式(Proxy)【结构型】
一.引言 今天我们要讲[结构型]设计模式的第七个模式,也是"结构型"设计模式中的最后一个模式,该模式是[代理模式],英文名称是:Proxy Pattern.还是老套路,先从名字 ...
- C#设计模式之十二代理模式(Proxy Pattern)【结构型】
一.引言 今天我们要讲[结构型]设计模式的第七个模式,也是“结构型”设计模式中的最后一个模式,该模式是[代理模式],英文名称是:Proxy Pattern.还是老套路,先从名字上来看看.“代理”可以理 ...
- 结构型模式(七) 代理模式(Proxy)
一.动机(Motivate) 在面向对象系统中,有些对象由于某种原因(比如对象创建的开销很大,或者某些操作需要安全控制,或者需要进程外的访问等),直接访问会给使用者.或者系统结构带来很多麻烦.如何在不 ...
随机推荐
- Linux&shell之处理用户输入
写在前面:案例.常用.归类.解释说明.(By Jim) 命令行参数$1为第一个参数,$2为第二个参数,依次类推...示例: #!/bin/bash # using one command line p ...
- SQL Standard Based Hive Authorization(基于SQL标准的Hive授权)
说明:该文档翻译/整理于Hive官方文档https://cwiki.apache.org/confluence/display/Hive/SQL+Standard+Based+Hive+Authori ...
- HBase Endpoint
引言 假设HBase某张表有1000个Region,里面存储着100万行数据,现在需要统计满足某些条件的行数,普通的做法是使用Filter(过滤条件),通过HBase API将满足过滤条件的行数据 ...
- CSU 1559 订外卖
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82842#problem/E 订外卖 解题思路:定义两个数组,a[]表示满A,b ...
- cf591A Wizards' Duel
A. Wizards' Duel time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...
- Java程序员需要注意的五大Docker误区
Docker现在很火,容器技术看上不无所不能,但这实际上是一种误解,不要被炒作出来的泡沫迷住双眼,本文抛去炒作,理性地从Java程序员的角度,列举出Docker目前的五大误区,帮助你更好地理解Dock ...
- rpm与dpkg yum与apt-get详解
由于自由软体的蓬勃发展,加上大型Unix-Like 主机的强大效能,让很多软体开发者将他们的软体使用Tarball 来释出. 后来Linux 发展起来后,由一些企业或社群将这些软体收集起来制作成为di ...
- Python学习笔记2-flask-sqlalchemy 简单笔记
flask-sqlalchemy 简单笔记 字数 阅读 评论 喜欢 flask-sqlalchemy SQLAlchemy已经成为了python世界里面orm的标准,flask是一个轻巧的web框架, ...
- TeamViewer或者向日葵等无法成功远程登录
之前一直能正常远程的两台电脑,今天不知道什么原因,莫名其妙的就无法登录了. 更悲催的时,今天早上走的时候,忘把TeamViewer或者向日葵软件启动了. 还好,我登录向日葵官网,在管理中心设置里面开启 ...
- UI几个重要使用方法
using UnityEngine; using System.Collections; using UnityEngine.SceneManagement; public class Applica ...