C++設計模式淺識裝飾模式

黄舟
發布: 2017-01-18 14:48:42
原創
1144 人瀏覽過

裝飾模式:動態的為一個物件添加一些額外的職責,就增加功能來說,裝飾模式比生成子類別更靈活。

裝飾模式的四個角色:

組件類別:Component

具體組件類別:ConereteComponent

裝飾類別:Decorator(從外類別來擴展Component類別的功能,但對於Component來說是無需知道Decoratorator 。 

測試案例:

[code]int main(){
    //初始化person(人)组件类Component,如果只有一个ConereteComponent类而不需要抽象的Component类,那么可以直接让Decorator继承具体的Component类。
    concretePerson *cp = new concretePerson("Jarrett");

    //初始化具体服饰类(装饰类Decorate)
    concreteTshirts *Tshirts = new concreteTshirts;
    concreteTrouser *Trouser = new concreteTrouser;
    concreteShoes *Shoe = new concreteShoes;
    //concreteSuit *Suit = new concreteSuit;
    concreteHat *Hat = new concreteHat;

    //依次进行装饰
    Tshirts->decorate(cp);
    Trouser->decorate(Tshirts);
    Shoe->decorate(Trouser);
    //Suit->decorate(Shoe);
    //显示结果
    Shoe->show();
    std::cout << std::endl;
    //再装饰一次查看效果
    Hat->decorate(Shoe);
    Hat->show();

    return 0;
}
登入後複製

裝飾模式實作:
[code]//主类
class concretePerson{
private:
    std::string name;//人名
public:
    concretePerson(){}
    concretePerson(std::string n):name(n){} //构造方式
    virtual void show()const{
        std::cout << name << "&#39;s dress: ";
    }
};

//服饰类(装饰类主类)
class Finery: public concretePerson{
protected:
    concretePerson *cPerson;//重点是维护一个主体类对象
public:
    void decorate(concretePerson *cp){
        cPerson = cp;
    }
    void show()const{
        if(cPerson != NULL)
            cPerson->show();
    }
};

//具体服饰类Tshirts
class concreteTshirts: public Finery{
public:
  void show()const{
      Finery::show(); //调用基类方法
      std::cout << "Tshirts ";  //用此来修饰
  }
};

//具体服饰类Tshirts
class concreteTrouser: public Finery{
public:
  void show()const{
      Finery::show(); //调用基类方法
      std::cout << "Trouser ";  //用此来修饰
  }
};

//具体服饰类Tshirts
class concreteShoes: public Finery{
public:
  void show()const{
      Finery::show(); //调用基类方法
      std::cout << "Shoe ";  //用此来修饰
  }
};

//具体服饰类Tshirts
class concreteSuit: public Finery{
public:
  void show()const{
      Finery::show(); //调用基类方法
      std::cout << "Suit ";  //用此来修饰
  }
};

//具体服饰类Tshirts
class concreteHat: public Finery{
public:
  void show()const{
      Finery::show(); //调用基类方法
      std::cout << "Hat ";  //用此来修饰
  }
};
登入後複製

總結: 


裝飾模式是為現有功能動態地添加更多的功能的一種方式。

應該在什麼時候使用呢? 

如果在一個已有程式中加入的功能只是為了滿足只在某些特定情況下才會執行的特殊行為的需要,若在主類別中加入程式碼會增加主類別複雜度。這時就需要裝飾模式把每個要裝飾的功能放在單獨的類別中,並讓這個類別包裝它所要裝飾的物件。 

因為,當需要執行特殊行為時,客戶代碼就可以在運行時根據需要有選擇的按順序地使用裝飾功能包裝物件。

裝飾模式的意思就是你自己的主體類和具體類該怎麼寫就怎麼寫,我想額外地增加特殊功能時,就使用額外的類來增加功能,這樣做比生成子類更加靈活,不需要修改原主體類別和具體類別的程式碼。




這樣將類別中的裝飾功能從主類搬移去除,可以簡化原有的類別。有效的把類的核心職責和裝飾功能區分開來,而且可以去除相關類中重複的裝飾邏輯。


以上就是C++設計模式淺識裝飾模式的內容,更多相關內容請關注PHP中文網(www.php.cn)!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!