适配器模式(C++实现)

(本博客旨在个人总结回顾)

1、详情:

适配器模式:将一个类接口转为换客户希望的另一个接口。Adapter模式使得由于接口不兼容的不能一起工作的那些类可以一起工作。

使用场景:主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。

说明:根据使用场景可以推断出适配器模式一般不是在软件设计初期设计的,而是在后期为了解决接口不兼容的情况,(不兼容可能第三方接口或者由于其他原因导致接口不兼容)。在特殊的情况下也有可能软件设计初期就这样设计,在使用第三方接口的情况下,而第三方接口本身设计的问题,根据这些接口设计反而导致软件逻辑不清晰和不好维护等问题。

优点:①解决接口不兼容问题。②提高类的复用和透明度。③灵活性好

缺点: 过多使用适配器,导致系统非常零乱,不易整体进行把握。

2.1、UML类图:

2.2、例子源码

客户希望转换成的目标接口(或类)

Target.h

#pragma once
class Target
{
public:
    Target();
    virtual ~Target();

public:
    virtual void Operation();
};

Target.cpp

#include "stdafx.h"
#include "Target.h"

Target::Target()
{
}

Target::~Target()
{
}

void Target::Operation()
{
    cout << "目标操作(已使用的类或接口)" << endl;
}

不兼容的接口或类:

SDKInterface.h

#pragma once
class SDKInterface
{
public:
    SDKInterface();
    ~SDKInterface();

public:
    void SDKOperation();
};

SDKInterface.cpp

#include "stdafx.h"
#include "SDKInterface.h"

SDKInterface::SDKInterface()
{
}

SDKInterface::~SDKInterface()
{
}

void SDKInterface::SDKOperation()
{
    cout << "不兼容的接口操作(使用适配器使其兼容)" << endl;
}

适配器类:

Adapter.h

#pragma once
#include "Target.h"
#include "SDKInterface.h"

class Adapter :
    public Target
{
public:
    Adapter();
    ~Adapter();

public:
    void Operation();

private:
    SDKInterface* m_pSDKInterface;
};

Adaper.cpp

#include "stdafx.h"
#include "Adapter.h"

Adapter::Adapter():m_pSDKInterface(NULL)
{
    m_pSDKInterface = new SDKInterface();
}

Adapter::~Adapter()
{
    if (m_pSDKInterface != NULL)
    {
        delete m_pSDKInterface;
        m_pSDKInterface = NULL;
    }
}

void Adapter::Operation()
{
    m_pSDKInterface->SDKOperation();
}

预编译头文件:

stdaft.h

// stdafx.h : 标准系统包含文件的包含文件,
// 或是经常使用但不常更改的
// 特定于项目的包含文件
//

#pragma once

#include "targetver.h"

#include <stdio.h>
#include <tchar.h>

#include <iostream>
using namespace std;

// TODO:  在此处引用程序需要的其他头文件

调用代码:

AdaperPatternMemo.cpp

// AdapterPatternMemo.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "Target.h"
#include "Adapter.h"

int _tmain(int argc, _TCHAR* argv[])
{
    Target* pTarget = new Target();
    pTarget->Operation();
    delete pTarget;
    pTarget = NULL;

    pTarget = new Adapter();
    pTarget->Operation();
    delete pTarget;
    pTarget = NULL;

    system("pause");
	return 0;
}

2.3、运行结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值