設計模式---裝飾模式(decorator)
阿新 • • 發佈:2019-02-03
裝飾模式(decorator),動態地給一個物件新增一些額外的職責,就增加功能來說,裝飾模式比生成子類更為靈活。
說白了就是擴充套件一個類的功能,而又不想用繼承。
不廢話先看UML和一段程式碼吧:
對應程式碼:
#include <iostream> using namespace std; class People { public: People(string name,string profession):Name(name),Profession(profession){} virtual void Introduce_slef() = 0; void IntroduceName() { cout << "My name is: " << Name << endl; } void IntroduceProfession() { cout << "My profession is: " << Profession << endl; } private: string Name; string Profession; }; class Student:public People { public: Student(string name,string profession,string school):People(name,profession) ,School(school){} void Introduce_slef() { IntroduceName(); IntroduceProfession(); } void Learn() { } //other interface private: string School; }; class Teacher:public People { public: Teacher(string name,string profession,int year):People(name,profession), WorkYear(year){} void Introduce_slef() { IntroduceName(); IntroduceProfession(); } void Teach() { } //other interface private: int WorkYear; }; class DecoratorPeople { public: DecoratorPeople(int id):ID(id),pl(NULL){} void Decorator(People *p) { pl = p; } void IntroduceId() { cout << "My ID is: " << ID << endl; } void Introduce_slef() { IntroduceId(); pl->Introduce_slef(); } private: int ID; People *pl; }; int main() { People *p = new Teacher("xiaozhang","teacher",5); People *p1 = new Student("xiaowang","student","New York"); DecoratorPeople md(3001); md.Decorator(p); md.Introduce_slef(); md.Decorator(p1); md.Introduce_slef(); delete p; delete p1; return 0; }
據上述UML圖和程式碼我們來介紹一下什麼叫裝飾模式,它是如何起到新增功能的作用的。
抽象了一個People類,派生了Student和Teacher兩個具體類,
從抽象類又派生了一個DecoratorPeople類,這個類來給People新增功能,就是所謂的裝飾類
這裡其實就是對多型的靈活運用,研究了這麼長時間本人認為所有設計模式都是對多型的靈活運用,離開多型一切免談。要不然c語言為什麼沒有設計模式?
職責單一原則,依賴倒轉原則,開放封閉原則這裡幾乎全部用到了。
設計模式也就是以原則為前提,靈活運用多型,然後考慮實際應用程式可能的維護和擴充套件,其實也並不深奧。