1. 程式人生 > >設計模式學習(C++實現)7——介面卡模式、裝飾器模式、代理模式、外觀模式

設計模式學習(C++實現)7——介面卡模式、裝飾器模式、代理模式、外觀模式

介面卡模式、裝飾器模式、代理模式和外觀有些類似,又有些不同,他們的實現形式差不多,都是對已有的方法和類進行封裝,以實現適配、增強、加以控制或隱藏系統複雜性的目的

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;
}

以上幾種形式比較類似,只是目的不同,此外也可以用繼承來實現。