設計模式學習(C++實現)7——介面卡模式、裝飾器模式、代理模式、外觀模式
阿新 • • 發佈:2019-02-18
介面卡模式、裝飾器模式、代理模式和外觀有些類似,又有些不同,他們的實現形式差不多,都是對已有的方法和類進行封裝,以實現適配、增強、加以控制或隱藏系統複雜性的目的
1 介面卡模式
例如多功能讀卡器,可插入多種不同的卡,完成讀取資料的功能。
class CardReader{
public:
virtual void read()=0;
virtual bool accepted_datatype(string datatype)=0;
}
class Card1_Reader:public CardReader{
public:
void read(){
std ::cout<<"read card1 data!";
}
bool accepted_datatype(string datatype){
if(datatype="card1_data")
return true;
return false;
}
}
class Card2_Reader:public CardReader{
public:
void read(){
std::cout<<"read card2 data!";
}
bool accepted_datatype(string datatype){
if(datatype="card2_data")
return true;
return false;
}
}
class Adapter{
public:
void read(string datatype){
for(auto& k: readers){
if(k->accepted_datatype(datatype))
k->read()
}
}
void add_reader(CardReader* reader){
readers.push_back(reader);
}
private:
std::vector<CardReader*> readers
}
以上寫得比較簡單,核心思想基本就是這樣了。
2 裝飾器模式
顧名思義,對已有的東西進行裝飾,使其在原有基礎上有一些新的特性,例如:
class Box{
public:
void readinfo(){
std::cout<<"I'm a box";
}
}
class Redbox{
public:
void readinfo(){
box.readinfo();
std::cout<<",and I'm red";
}
private:
Box box;
}
3 代理模式
主要用於對已有的東西的介面進行控制,使其在原有基礎上更加完善,不易被誤用等功能,例如:
class File{
public:
void load(){
std::cout<<"file load from disk...";
}
}
class ProxyFile{
public:
void load(){
if(loaded)
std::cout<<"file has been loaded!";
else{
file.load();
loaded=true;
}
}
private:
bool loaded=false;
}
4 外觀模式
提供一個簡潔的介面供外部使用,把內部實現進行封閉,這樣即使有內部的程式碼和功能修改外部也不會察覺,更利於使用者的使用
class HardWare{
public:
virtual void initial()=0;
}
class CPU:public HardWare{
public:
void initial(){
std::cout<<"initial CPU...!";
}
}
class Memory:public HardWare{
public:
void initial(){
std::cout<<"initial memory...!";
}
}
class computer{
public:
void initial(){
cpu.initial();
memory.initial();
}
private:
CPU cpu;
Memory memory;
}
以上幾種形式比較類似,只是目的不同,此外也可以用繼承來實現。