1. 程式人生 > >設計模式---裝飾模式(decorator)

設計模式---裝飾模式(decorator)

裝飾模式(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語言為什麼沒有設計模式?

職責單一原則,依賴倒轉原則,開放封閉原則這裡幾乎全部用到了。

設計模式也就是以原則為前提,靈活運用多型,然後考慮實際應用程式可能的維護和擴充套件,其實也並不深奧。