1. 程式人生 > >大話設計模式C++實現-第17章-適配器模式

大話設計模式C++實現-第17章-適配器模式

req span oid efi cpp endif 對象 adapt sdn

一、UML圖

技術分享

關鍵詞:Client須要Request()函數,Adaptee提供的是SpecificRequest()函數,Adapter提供一個Request()函數將Adaptee和SpecificeRequest()函數封裝起來。


二、概念

適配器模式:將一個類的接口轉換成客戶希望的另外一個接口。Adapter模式使得原來因為接口不兼容而不能一起工作的那些類能夠一起工作。


三、說明

角色:

(1)Target:這是客戶所期待的接口,Target能夠是詳細的或抽象的類,也能夠是接口。

(2)Adaptee:須要適配的類。

(3)Adapter:

通過在內部包裝一個Adaptee對象,把源接口轉換成目標接口。

什麽時候用?

(1)在想使用一個已存在的類,可是假設他的接口,也就是它的方法和你的要求不同樣時,就應該考慮用適配器模式。

(2)用了適配器模式。客戶代碼能夠統一調用統一接口即可了,這樣能夠更簡單。更直接,更緊湊。

(3)要在兩方都不太easy改動的時候再使用適配器模式適配,而不是一有不同是就使用它。


四、C++實現

(1)Adapter.h

#ifndef ADAPTER_H
#define ADAPTER_H

#include <string>
#include <iostream>

//Target,此處為運動員
class Player
{
protected:
	std::string name;
public:
	Player(std::string name)
	{
		this->name=name;
	}
	virtual void Attack()=0;
	virtual void Defense()=0;
};

//Adaptee,此處為外籍中鋒。它的接口和Target的接口不一樣,需要翻譯來幫忙轉換
class ForeignCenter
{
private:
	std::string name;
public:
	void SetName(std::string name)
	{
		this->name=name;
	}
	std::string GetName()
	{
		return name;
	}
	void ForeignAttack()
	{
		std::cout<<"外籍中鋒  "<<name<<"  進攻"<<std::endl;
	}

	void ForeignDefense()
	{
		std::cout<<"外籍中鋒  "<<name<<"  防守"<<std::endl;
	}
};

//Adapter,此處為翻譯
class Translator:public Player
{
private:
	ForeignCenter* wjzf;
public:
	Translator(std::string name):Player(name)
	{
		wjzf=new ForeignCenter;
		wjzf->SetName(name);
	}
	~Translator()
	{
		delete wjzf;
	}
	void Attack()
	{
		wjzf->ForeignAttack();
	}

	void Defense()
	{
		wjzf->ForeignDefense();
	}
};


//以下是普通的  接口和Target接口一樣的 3個子類,必需要翻譯
//前鋒
class Forwards:public Player
{
public:
	Forwards(std::string name):Player(name){}

	void Attack()
	{
		std::cout<<"前鋒  "<<name<<"  進攻"<<std::endl;
	}

	void Defense()
	{
		std::cout<<"前鋒  "<<name<<"  防守"<<std::endl;
	}
};

//中鋒
class Center:public Player
{
public:
	Center(std::string name):Player(name){}

	void Attack()
	{
		std::cout<<"中鋒  "<<name<<"  進攻"<<std::endl;
	}

	void Defense()
	{
		std::cout<<"中鋒  "<<name<<"  防守"<<std::endl;
	}
};

//後衛
class Guards:public Player
{
public:
	Guards(std::string name):Player(name){}

	void Attack()
	{
		std::cout<<"後衛  "<<name<<"  進攻"<<std::endl;
	}

	void Defense()
	{
		std::cout<<"後衛  "<<name<<"  防守"<<std::endl;
	}
};




#endif


(2)Client.cpp

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

//Client
void main()
{
	Player* b=new Forwards("巴蒂爾");
	b->Attack();

	Player* m=new Guards("麥克格雷迪");
	m->Attack();

	//翻譯告訴姚明。教練讓你既要進攻,又要防守
	Player* ym=new Translator("姚明");
	ym->Attack();
	ym->Defense();

	delete b;
	delete m;
	delete ym;

	system("pause");
}


(3)執行截圖

技術分享


大話設計模式C++實現-第17章-適配器模式