【設計模式】——橋接模式

橋接模式(Bridge),將抽象部分與它的實現部分分離,使他們均可以獨立地變化。ios

  什麼是抽象與它的實現分離,這並非說,讓抽象類與其派生類分離,由於這沒有任何意義。實現指的是抽象類和它的派生類用來實現本身的對象。實現系統可能有多角度分類,每一種分類都有可能變化,那麼就把這種多角度分離出來讓他們獨立變化,減小他們之間的耦合。也就是說在咱們發現須要多角度去分類實現對象,而只用繼承會形成大量的類增長,不能知足開放-封閉原則時,就應該考慮用橋接模式。this

橋接模式基本代碼spa

#include <iostream>

using namespace std;
//Implementor類
class Implementor
{
public:
    virtual void Operator()=0;
};
//ConcreteImplementorA和ConcreteImplementorB等派生類
class ConcreteImplementorA:public Implementor
{
public:
    void Operator()
    {
        cout << "具體實現A的方法執行" << endl;
    }
};
class ConcreteImplementorB:public Implementor
{
public:
    void Operator()
    {
        cout << "具體實現B的方法執行" << endl;
    }
};
//Abstraction類
class Abstraction
{
protected:
    Implementor *m_implementor;
public:
    void SetImplementor(Implementor *implementor)
    {
        this->m_implementor=implementor;
    }
    virtual void Operator()
    {
        m_implementor->Operator();
    }
};
//RefinedAbstraction類
class RefinedAbstraction:public Abstraction
{
public:
    void Operator()
    {
        m_implementor->Operator();
    }
};
int main()
{
    Abstraction *ab=new Abstraction();
    ab->SetImplementor(new ConcreteImplementorA());
    ab->Operator();
    ab->SetImplementor(new ConcreteImplementorB());
    ab->Operator();
    return 0;
}

2、合成/聚合複用原則code

  合成/聚合原則(CARP),儘可能使用合成/聚合,儘可能不要使用類繼承。對象

  對象的繼承關係是在編譯時就定義i好了,因此沒法在運行時改變從父類繼承的實現。子類的實現與它的父類有很是緊密的依賴關係,以致於父類實現中的任何變化必然會致使子類發生變化。當你須要複用子類時,若是繼承下來的實現不適合解決新的問題,則父類必須重寫或被其餘更適合的類替換。這種依賴關係限制了靈活性並最終限制了複用性。
blog

  聚合表示一種弱的擁有關係,體現的是A對象能夠包含B對象,但B對象不是A對象的一部分;合成則是一種強的擁有關係,體現了嚴格的部分和總體的關係,部分和總體的生命週期同樣。合成/聚合複用原則的好處是,優先使用對象的合成/聚合將有助於你保持每一個類被封裝,並被集中在單個任務上。這樣類和類繼承層次會保持較小規模,而且不太可能增加爲不可控制的龐然大物。繼承

#include <iostream>

using namespace std;
//手機軟件
class HandSetSoft
{
public:
    virtual void Run()=0;
};
//手機遊戲
class HandSetGame:public HandSetSoft
{
public:
    void Run()
    {
        cout << "運行手機遊戲" << endl;
    }
};
//手機通信錄
class HandSetAddressList:public HandSetSoft
{
public:
    void Run()
    {
        cout << "運行手機通信錄" << endl;
    }
};
//手機品牌
class HandSetBrand
{
protected:
    HandSetSoft *m_soft;
public:
    void SetHandSetSoft(HandSetSoft *soft)
    {
        this->m_soft=soft;
    }
    virtual void Run(){}
};
//品牌N品牌M具體類
class HandSetBrandN:public HandSetBrand
{
public:
    void Run()
    {
        m_soft->Run();
    }
};
class HandSetBrandM:public HandSetBrand
{
public:
    void Run()
    {
        m_soft->Run();
    }
};
int main()
{
    HandSetBrand *ab=new HandSetBrandN();
    ab->SetHandSetSoft(new HandSetGame());
    ab->Run();
    ab->SetHandSetSoft(new HandSetAddressList());
    ab->Run();
    ab=new HandSetBrandM();
    ab->SetHandSetSoft(new HandSetGame());
    ab->Run();
    ab->SetHandSetSoft(new HandSetAddressList());
    ab->Run();
    return 0;
}
相關文章
相關標籤/搜索