Adapter模式

  • Adapter模式

    • 类模式
    • 对象模式

Adapter模式

在软件开发过程中,经常会使用第三方库。如果使用第三方库,那么我们对客户提供的接口和第三方库的接口不一致时,应该怎么解决。这是Adapter模式要解决的问题。即把一个类的接口转化为客户希望的接口。

Adatper模式的实现这里给出2中模式:类模式和对象模式。

类模式中,Adapter类继承和复用Adaptee的接口;而对象模式中,Adapter采用组合的方式来调用Adaptee中的接口。

类模式中,类的结构如下:

下面给出实现:

类模式

//Adapter.h

//Adapter.h

#ifndef _ADAPTER_H_
#define _ADAPTER_H_

class Target
{
public:
    Target();
    virtual ~Target();
    virtual void Request();
};

class Adaptee
{
public:
    Adaptee();
    ~Adaptee();
    void SpecificRequest();
};

class Adapter :public Target, private Adaptee
{
public:
    Adapter();
    ~Adapter();
    void Request();
};
#endif

//Adapter.cpp

//Adapter.cpp

#include"Adapter.h"
#include<iostream>

Target::Target()
{}
Target::~Target()
{}
void Target::Request()
{
    std::cout << "Target::Request" << std::endl;
}

Adaptee::Adaptee()
{}
Adaptee::~Adaptee()
{}
void Adaptee::SpecificRequest()
{
    std::cout << "Adaptee::SpecificRequest" << std::endl;
}

Adapter::Adapter()
{}
Adapter::~Adapter()
{}
void Adapter::Request()
{
    this->SpecificRequest();
}

//main.cpp

#include"Adapter.h"
int main()
{
    Target* adt = new Adapter();
    adt->Request();
    return 0;
}

对象模式

对象模式中,类的结构如下:

//Adapter.h

//Adapter.h

#ifndef _ADAPTER2_H_
#define _ADAPTER2_H_

class Target
{
public:
    Target();
    virtual ~Target();
    virtual void Request();
};

class Adaptee
{
public:
    Adaptee();
    ~Adaptee();
    void SpecificRequest();
};

class Adapter :public Target
{
public:
    Adapter(Adaptee* ade);
    ~Adapter();
    void Request();
private:
    Adaptee* _ade;
};
#endif

//Adapter.cpp

//Adapter.cpp

#include"Adapter2.h"
#include<iostream>

Target::Target()
{}
Target::~Target()
{}
void Target::Request()
{
    std::cout << "Target::Request" << std::endl;
}

Adaptee::Adaptee()
{}
Adaptee::~Adaptee()
{}
void Adaptee::SpecificRequest()
{
    std::cout << "Adaptee::SpecificRequest" << std::endl;
}

Adapter::Adapter(Adaptee* ade)
{
    _ade = ade;
}
Adapter::~Adapter()
{}
void Adapter::Request()
{
    _ade->SpecificRequest();
}

//main.cpp

#include"Adapter2.h"
int main()
{
    Target* adt = new Adapter(new Adaptee());
    adt->Request();
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-11 00:25:37

Adapter模式的相关文章

java演示适配器(adapter)模式

为什么要使用模式: 模式是一种做事的一种方法,也即实现某个目标的途径,或者技术. adapter模式的宗旨就是,保留现有类所提供的服务,向客户提供接口,以满足客户的需求. 类适配器:客户端定义了接口并实现了这个接口,这个接口中的方法在自己的类库中有更好的实现方式,但是方法名不一样,不能为用户所用,可以定义一个类实现这个接口,这个接口中的方法可以委托给自己类库中的方法实现效果,以满足客户的需求.这种方式叫做接口适配. // 已存在的.具有特殊功能.但不符合我们既有的标准接口的类 class Ada

设计模式指六-Adapter模式

适配器模式,使用之处比较特殊,不属于常规设计模式,主要用于不同系统之间的处理.是将一个类的接口转换成客户希望的另外一个接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 系统内部的实体接口 //IUserInfo.h// #pragma once #include <iostream> using std::string; class IUserInfo { public: IUserInfo(void) { } virtual ~IUserInfo(void)

Adapter 模式

在实际软件系统设计和开发中,会经常遇到这种问题:我们为了完成某项工作购买了一个第三方的库来加快开发. 这就带来了一个问题: 我们在应用程序中已经设计好了接口,与这个第三方提供的接口不一致,为了使得这些接口不兼容的类可以在一起工作,Adapter 模式提供了将一个类(第三方库)的接口转化为客户(购买使用者)希望的接口. 1 //////////////Adapter.h////////////////// 2 #pragma once 3 class Target 4 { 5 public: 6

敏捷软件开发 – ABSTRACT SERVER模式、ADAPTER模式和BRIDGE模式

设计运行在简易台灯中的软件.台灯由一个开关和一盏灯组成.可以询问开关是开着还是关着,也可以让灯打开或者关闭. 下面设计了一个简易的模型.Switch对象可以轮询实际开关的状态,并且可以发送相应的turnOn和turnOff消息给Light. 这个设计违反了两个设计原则:依赖倒置(DIP)和开放-封闭(OCP).对DIP的违反是明显的,Switch依赖了具体类Light.DIP告诉我们要优先依赖于抽象类.对OCP的违反虽然没有那么明显,但是更加切中要害.我们之所以不喜欢这个设计是因为它迫使我们在任

Java 实现适配器(Adapter)模式

平时我们会常常碰到这种情况,有了两个现成的类,它们之间没有什么联系.可是我们如今既想用当中一个类的方法.同一时候也想用另外一个类的方法.有一个解决方法是.改动它们各自的接口.可是这是我们最不愿意看到的.这个时候Adapter模式就会派上用场了 适配器 模式 有三种方式,一种是对象适配器,一种是类适配器, 一种是接口适配器 下面举例说明: 类适配器 类图 public class DrawRectangle {//画方 public void drawRectangle(String msg) {

设计模式-Adapter模式

最近在工作中遇到了一种场景,大概是这样:一个项目中,包含Widget(桌面小部件),它是由RemoteViews来渲染和实现的,而现在的需求是,要在应用程序里面对Widget上的字体大小和颜色进行设置,并且在应用里面能够看到变化,这就需要由View来渲染和实现.但是View和RemoteViews事两个不相关的类,他们渲染的方式完全不一样,但是我又不想重新写一套View的渲染代码,这就想到了Adapter模式. 意图 将一个类的接口转换成客户希望的另一个接口.Adapter模式使原本由于接口不兼

打造炫酷通用的ViewPager指示器 - Adapter模式适配所有

1.概述 上一期我们已经写了一篇 打造炫酷通用的ViewPager指示器 - 玩转字体变色 可是这种效果虽然绚烂可以装装A和C之间,但是在实际的大多数效果中并不常见,只是在内涵段子中有这个效果而已,那么这一期我们就用Adapter适配器模式适配所有的效果,堪称终结者.附视频地址:等这个周末吧 2.效果实现 2.1 整合上一个实例: 我还是还是拿上一个实例来做演示吧.这里我贴几种常见的效果,首先声明Android自带的有这个控件叫TabLayout,大家可以自己用用试试看好用不?我也用过但是不做任

【结构型】Adapter模式

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

Structual设计--Adapter模式

1.意图 将一个类的接口转换成客户希望的另一个接口.Adapter模式使得原来由于接口不兼容而不能在一起工作的那些类可以在一起工作. 2.别名 包装器Wrapper. 3.动机 有时,为复用而设计的工具箱类不能够被复用原因仅仅是因为它的接口与专业应用领域所需要的接口不匹配.具体场景可以描述为:基础功能类–>adapter专业接口–>专业调用,其中基础功能类可以理解为我们常见的jdk,也可以是一些sdk或者一些平台支持类. 4.适用性 以下情况使用Adapter模式 你想使用一个已经存在的类,而