(本博客旨在个人总结回顾)
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;
}