1. 程式人生 > 其它 >介面卡,橋接,代理,享元模式示例程式碼

介面卡,橋接,代理,享元模式示例程式碼

介面卡模式:

// 介面卡模式 將一個類的介面轉換成客戶希望的另外一個介面
// 介面層
class OutInterface {
public:
    virtual ~OutInterface() = default;
    // 客戶希望實現的介面 例如: 使用者希望一次性列印姓名 年齡 成績
    virtual void ShowInfomation() = 0;
};

// 驅動層
class Driver {
public:
    // 內部原本的介面 姓名,年齡,成績分別在不同的介面中實現
    void ShowName(string name) { cout << "Name: 
" << name << " " << endl;}; void ShowAge(int age) { cout << "Age: " << age << " " << endl;}; void ShowScore(int score) { cout << "score: " << score << " " << endl;}; }; // 適配層 class Adapter : public OutInterface { public:
virtual void ShowInfomation() override { Driver dr; dr.ShowName("張三"); dr.ShowAge(24); dr.ShowScore(100); } }; TEST(Adapter, Adapter1) { OutInterface* inc = new Adapter(); inc->ShowInfomation(); delete inc; }

橋接模式:

// 抽象部分, 外部介面,抽象化產品
// 當一個類存在兩個獨立變化的維度,且這兩個維度都需要進行擴充套件時。
// 當一個系統不希望使用繼承或因為多層次繼承導致系統類的個數急劇增加時。 // 當一個系統需要在構件的抽象化角色和具體化角色之間增加更多的靈活性時。 // 例子1: 畫圖形 正方形, 圓形,長方形 顏色:紅色,黑色, 白色 // 顏色 class Color { public: virtual void FillColor(string produce) = 0; virtual ~Color() {}; }; // 形狀 class Shape { protected: Color* fillcolor; public: Shape(Color* userColor): fillcolor(userColor){}; virtual void DrawShape() = 0; }; // 具體的形狀類 class Rectangle : public Shape { public: virtual void DrawShape() override { fillcolor->FillColor("長方形"); } Rectangle(Color* userColor) : Shape(userColor) {} }; class Square : public Shape { public: virtual void DrawShape() override { fillcolor->FillColor("正方形"); } Square(Color* userColor) : Shape(userColor) {} }; class White : public Color { public: virtual void FillColor(string produce) override { cout << "entry White " << __func__ << endl; cout << "白色的" + produce << endl; } }; class Black : public Color { public: virtual void FillColor(string produce) override { cout << "entry Black " << __func__ << endl; cout << "黑色的" + produce << endl; } }; TEST(bridge_module, bridge1) { Color* w = new White(); Color* blk = new Black(); Rectangle rg(w); Square sq(blk); sq.DrawShape(); rg.DrawShape(); }

代理模式:

class Service {
public:
    int QueryData() {
        // 服務端,查詢資料,訂閱資料,修改資料等
        cout << "this is service data" << endl;
        return 0;
    }
};
// 代理模式
class CProxy {
private:
    CProxy() {
    }
    static CProxy* Instance;
    Service m_server;
public:
    static CProxy* GetInstance() {
        if (Instance == nullptr) {
            Instance = new CProxy();
        }
        return Instance;
    }
    static CProxy& GetProxy() {
        static CProxy single;
        return single;
    }

    int QueryData() {
        // 代理訪問服務端
        m_server.QueryData();
        return 0;
    }
};

CProxy* CProxy::Instance = nullptr;

class Client {
public:
    void ShowData()
    {
        CProxy* px = CProxy::GetInstance();
        px->QueryData();
        CProxy prx = CProxy::GetProxy();
        prx.QueryData();
    }
};


TEST(Proxy, Proxy1)
{
    Client cl;
    cl.ShowData();
}

享元模式

// 享元模式 共享資料
class SharedOption {
public:
    virtual void Option() = 0;
};

class SharedOptionA : public SharedOption{
public:
    virtual void Option() override {
        cout << "Opention A key:" + m_key << endl;
    }
    SharedOptionA(string optKey) : m_key(optKey) {}
private:
    string m_key;
};

class ShareFactory {
public:
    SharedOption* GetShareOpention(string opentionkey) {
        map<string, SharedOption*>::iterator item = m_OptionMap.find(opentionkey);
        if (item == m_OptionMap.end()) {
            SharedOption* opt = new SharedOptionA(opentionkey);
            m_OptionMap.insert(make_pair(opentionkey, opt));
            return opt;
        } else {
            cout << item->first << " " << "find" << endl;
            return item->second;
        }
    }

private:
    map<string, SharedOption*> m_OptionMap;
};

TEST(Shareddata, main)
{
    ShareFactory sf;
    SharedOption* opt1 = sf.GetShareOpention("first");
    opt1->Option();
    SharedOption* opt2 = sf.GetShareOpention("two");
    opt2->Option();
    SharedOption* opt3 = sf.GetShareOpention("three");
    opt3->Option();
    SharedOption* opt4 = sf.GetShareOpention("first");
    opt4->Option();
    SharedOption* opt5 = sf.GetShareOpention("two");
    opt5->Option();
}