接口隔离模式

  • 在组件构建过程中,某些接口之间直接的依赖常常会带来很多问题、甚至根本无法实现。采用添加一层间接(稳定)接口,来隔离本来互相紧密关联的接口是一种常见的解决方案。

典型模式

Adapter

动机(Motivation)

  • 在软件系统中,由于应用环境的变化,常常需要将“一些现存的对象”放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足的。
  • 如何应对这种“迁移的变化”? 如何既能利用现有对象的良好实现,同时又能满足新的应用环境所要求的接口?

模式定义

将一个类的接口转换成客户希望的另,个接口。Adapter模式使得原本由于接台不兼容而不能一起土作的那些类可以一竖作。

结构

要点总结

  • Adapter模式主要应用于"希望复用一些现存的类,但是接口又与复用环境要求不一致的情况”, 在遗留代码复用、类库迁移等方面非常有用。
  • GoF 23定义了两种Adapter模式的实现结构。:对象适配器和类适配器。但类适配器采用“多继承"的实现方式,一般不推荐使用。对象适配器采用“对象组合”的方式,更符合松耦合精神。
  • Adapter模式可以实现的非常灵活,不必拘泥于Gof23中定义的两种结构。例如完全可以将Adapter模式中的 “现存对象”作为新的接口方法参数,来达到适配的目的。

cpp

#include<iostream>

//目标接口(新接口)
class ITarget
{
public:
virtual void process() = 0;
virtual ~ITarget() {}
}; //遗留接口(老接口)
class IAdaptee
{
public:
virtual int bar() = 0;
virtual void foo(int) = 0;
virtual ~IAdaptee() {}
};
//遗留类型
class OldClass :public IAdaptee
{
public:
virtual int bar()
{
return 1024;
}
virtual void foo(int data)
{
std::cout << data << std::endl;
}
};
//对象适配器
class Adapter :public ITarget
{
public:
Adapter(IAdaptee* pAdaptee) :pAdaptee_(pAdaptee) {}
virtual void process()
{
int data = pAdaptee_->bar();
pAdaptee_->foo(data);
}
protected:
IAdaptee* pAdaptee_; //对象组合
}; /*类适配器
class Adapter : public ITarget,
protected OldClass { //多继承
//... }
*/
int main()
{
IAdaptee* pAdaptee = new OldClass();
ITarget* pTarget = new Adapter(pAdaptee);
pTarget->process();
return 0;
}

C++设计模式 - 适配器模式(Adapter)的更多相关文章

  1. 设计模式 - 适配器模式(adapter pattern) 具体解释

    适配器模式(adapter pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 适配器模式(adapter pattern): 将一个类的接 ...

  2. 设计模式 - 适配器模式(adapter pattern) 枚举器和迭代器 具体解释

    适配器模式(adapter pattern) 枚举器和迭代器 具体解释 本文地址: http://blog.csdn.net/caroline_wendy 參考适配器模式(adapter patter ...

  3. 设计模式--适配器模式Adapter(结构型)

    一.适配器模式 适配器模式的主要作用是在新接口和老接口之间进行适配.将一个类的接口转换成客户端期望的另外一个接口.其实适配器模式有点无赖之举,在前期设计的时候,我们就不应该考虑适配器模式,而应该通过重 ...

  4. 说说设计模式~适配器模式(Adapter)

    返回目录 之前和大家一起谈了工厂模式和单例模式,今天来看一下另一种非常常用的模式,它就是适配器模式,第一次看到这个模式是通过“张逸”老师的“设计之道”这篇文章,在这里表adapter讲的很透彻,今天把 ...

  5. [工作中的设计模式]适配器模式adapter

    一.模式解析 适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 也就是说,如果已经写好了一个接口,但是又来了一种截然不同的接口,如 ...

  6. C#设计模式——适配器模式(Adapter Pattern)

    一.概述在软件开发中,常常会想要复用一个已经存在的组件,但该组件的接口却与我们的需要不相符,这时我们可以创建一个适配器,在需复用的组件的接口和我们需要的接口间进行转换,从而能够正常的使用需复用的组件. ...

  7. 设计模式-适配器模式(Adapter)

    简介: 适配器模式在我看来是最无聊的一种模式,因为他根本不是一种新的创意模式,而是一种不得已而为之的模式.就算不学适配器模式,在具体应用场景中也会自然而然的想到这种解决方案. 张三在英国留学时买了个笔 ...

  8. 大话设计模式--适配器模式 Adapter -- C++实现实例

    1.适配器模式: 将一个类的接口转换为客户希望的另一个接口,使得原来由于接口不能一起工作的那些类一起工作. 适配器模式一般用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况. 适配器模式分 ...

  9. [设计模式]适配器模式Adapter

    将一个类的接口转换成客户希望的另外一个接口. A d a p t e r模式使得原本 由于接口不兼容而不能一起工作的那些类可以一起工作.

  10. 设计模式(五)适配器模式Adapter(结构型)

      设计模式(五)适配器模式Adapter(结构型) 1. 概述: 接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题.程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相 ...

随机推荐

  1. 循环掌控:深入理解C语言循环结构,高效实现重复性任务

    欢迎大家来到贝蒂大讲堂 养成好习惯,先赞后看哦~ 所属专栏:C语言学习 贝蒂的主页:Betty's blog 引言 前面贝蒂带大家了解了选择结构,今天就来为大家介绍循环结构,也就是我们熟悉的while ...

  2. 删除node_modules文件夹cmd指令 - 20201015

    方法 方法一: rm -rf /node_modules cmd原生命令.只要支持cmd就可以使用. 方法二: rmdir /s/q your_app_dir 原生node方法,redir为node删 ...

  3. django学习第十二天--ajax请求和csrftoken认证的三种方式

    基于cookie的登录认证装饰器 def check_login(f): def inner(request,*args,**kwargs): is_login = request.COOKIES.g ...

  4. linux基本命令--day02

    目录树架构示意图 以下是对这些目录的解释: /bin: bin是Binary的缩写, 这个目录存放着最经常使用的命令. /boot: 这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以 ...

  5. Advanced .Net Debugging 2:CLR基础

    一.简介 这是2024新年后我的第一篇文章,也是我的<Advanced .Net Debugging>这个系列的第二篇文章.这篇文章告诉我们为了进行有效的程序调试,我们需要掌握哪些知识.言 ...

  6. 【八股cover#3】计网 Q&A与知识点

    计网知识点Q&A 简历cover 1.TCP/IP网络模型 网络模型 ​ TCP/IP 协议族,它是一个分层.多协议的通信体系. ​ TCP/IP协议族是一个四层协议系统,自底而上分别是数据链 ...

  7. 【LeetCode链表#12】链表相交

    链表相交 同:160.链表相交 力扣题目链接(opens new window) 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点.如果两个链表没有交点,返 ...

  8. AFNetworking整体框架简单整理

    一.AFNetworking整体框架是怎样的 1.UIKit集成模块 UIKit 2.请求序列化 Serialization 3.响应序列化 Serialization 4.会话 NSURLSessi ...

  9. 【Azure 应用服务】收集App Service 关于Availability Zone, Health check 以及 Traffic Manager的文档,并了解高可用(HA)和灾备(DR)

    问题描述 收集App Service 关于Availability Zone, Health check 以及 Traffic Manager的文档,并了解高可用(HA)和灾备(DR)的具体办法 问题 ...

  10. 【Azure 应用程序见解】在Docker中运行的ASP.NET Core应用如何开启Application Insights的Profiler Trace呢? 

    问题描述 使用Azure Application Insights收集AKS中ASP.NET Core应用的监控数据,自动收集请求的Trace情况,用于分析单个请求在应用内部的耗时及处理事件情况,参考 ...