對象模式所屬類別簡介
接口隔離模式包括:facade、proxy、adapter、mediator
採用一層隔離層來解決類之間錯亂依賴。
對象模式所屬類別簡介
adapter-適配器模式
當前模式簡介動機
由於應用環境的變化,將一些對象的使用用在新的環境上,但是新的環境可能不適合這些對象。如何利用原有的對象,滿足新環境的需求?
需求
在windows系統上,類A的行爲只有DoTask
設計一
需求更改
現在增加mac,現在類A還是有DoTask,但是除了有DoTask還有打印hello操作。如何才能繼續繼續用之前類A的DoTask。
設計一更改版本
違反原則
設計二
class IA //舊
{
public:
virtual void DoTask() = 0;
};
class CA: public IA //舊
{
public:
virtual void DoTask() { std::cout <<"dotask" << std::endl; }
};
int main() //調用
{
CA *t =new CA;
t->DoTask();
return 0;
}
//打印
dotask
設計二更改版本
#include "stdafx.h"
#include <iostream>
using namespace std;
class IA //舊
{
public:
virtual void DoTask() = 0;
};
class CA: public IA //舊
{
public:
virtual void DoTask() { std::cout <<"dotask" << std::endl; }
};
////////////////////////////////////////////
class IB //新
{
public:
virtual void DoTask() = 0;
};
//對象適配器
class CADapt: public IB //新
{
public:
IA *m_ia;
CADapt(IA *ia) { this->m_ia = ia; }
virtual void DoTask() { this->m_ia->DoTask(); std::cout << "hello"<<std::endl; }
};
//類適配器
class CADapt2: public IB, protected CA //新
{
public:
IA *m_ia;
CADapt2(IA *ia) { this->m_ia = ia; }
virtual void DoTask() { this->m_ia->DoTask();std::cout << "hello"<<std::endl; }
};
//////////////////////////////////////////////////////////////
int main() //調用
{
//對象適配器
IA *t =new CA;
IB *t2 = new CADapt(t);
t2->DoTask();
//類適配器
CADapt2 *t3=new CADapt2(t);
t3->DoTask();
return 0;
}
//打印
dotask
hello
dotask
hello
設計二比設計一區別
模式定義
將一個類的接口轉換成客戶希望的另一個接口。Adapter模式使得原本由於接口不兼容而不能一起工作的那些類可以一起工作。(把原來的類傳入新的類,新的類複用原來類的行爲。)
模式結構
要點總結
希望複用一些現存的類,但是接口又與複用環境要求不一樣。
分爲類適配器和對象適配器。類適配器使用多繼承,不推薦;對象適配器使用對象組合方式。
Adapter是新的類,adaptee是舊的,組合起來