设计模型--装饰者模式(c++)

简单概述:

小明穿衣案例。平时他上身穿短t恤,下身穿牛仔裤。

  1. 今天小明准备出去约会,需要精心打扮,决定上身穿西装,下身穿西装裤。
  2. 明天天气转凉,小明打算上身加多一件外套。

关键点:

  1. 小明一定会穿上身和下身的衣服
  2. 上身和下身的衣服可换可加

总结:

在不破坏(改变)原有的功能(上身穿短t恤,下身穿牛仔裤)的条件下,给对象(小明的穿着)动态改变功能(上身穿西装,下身穿西装裤)或添加功能(上身添一件外套)。

上述就是装饰者模式的理解。

个人认为十分有利于版本迭代以及版本切换,即使后续类逐渐增多,通过工厂来管理可以更便捷清楚哪些类与版本相关

UML结构图

1d99c893f54f4c81afeca6b5289b9534.png

代码:

#include <iostream>

#include <string>

class person {

private:

    std::string name_;

public:

    person() {};

    ~person() {};

    void setName(std::string name) { name_ = name; }

    virtual void getPersonName() { std::cout << name_ << std::endl; };

    virtual void upDress() { std::cout << "穿t恤" << std::endl; };

    virtual void downDress() { std::cout << "穿牛仔裤" << std::endl; };

};



class dress : public person {

protected:

    std::shared_ptr<person> object_;

public:

    dress() :object_(nullptr) {};

    ~dress() {};

    void setPerson(std::shared_ptr<person> p)

    {

        object_.reset();

        object_ = p;

    }

    void getPersonName() {

        if (object_ != nullptr) object_->getPersonName();

    };

    void upDress() override {

        if (object_ != nullptr) object_->upDress();

    };

    void downDress() override {

        if (object_ != nullptr) object_->downDress();

    };

};



//经常穿

class dressOften : public dress {

public:

    dressOften() {};

    ~dressOften() {};

};



//今天穿

class dressSuit : public dress {

public:

    dressSuit() {};

    ~dressSuit() {};

    void upDress() override {

        std::cout << "穿西装" << std::endl;

    };

    void downDress() override {

        std::cout << "穿西装裤" << std::endl;

    };

};



//明天穿

class dressCoat : public dressOften {

public:

    dressCoat() {};

    ~dressCoat() {};

    void upDress() override {

        dressOften::upDress();

        std::cout << "穿外套" << std::endl;

    };

};



//还可以通过工厂模式决定

class dressStrategy

{

    //相当于换衣室

public:

    dressStrategy() {};

    ~dressStrategy() {};

    person* getPersonWithDress(int type, std::string name) {

        switch (type)

        {

            case 0:

            {

                std::shared_ptr<person> p = std::make_shared<person>(); //有一个穿t恤和牛仔裤的人

                p->setName(name); //名叫name

                dressSuit* clothes = new dressSuit(); //西装套装

                clothes->setPerson(p); //这个人换沈西装套装

                return clothes;

            }

            case 1:

            {

                std::shared_ptr<person> p = std::make_shared<person>(); //有一个穿t恤和牛仔裤的人

                p->setName(name); //名叫name

                dressCoat* clothes = new dressCoat(); //穿外套

                clothes->setPerson(p); //外套穿这个人身上

                return clothes;

            }    

        }

    };

};





int main()

{

    dressStrategy* ds = new dressStrategy();

    person* p1 = ds->getPersonWithDress(0, "小明");//小明今天要约会,要穿西装套装

    p1->getPersonName();

    std::cout << "今日穿搭:" << std::endl;

    p1->upDress();

    p1->downDress();

    std::cout << std::endl;

    person* p2 = ds->getPersonWithDress(1, "小明");

    p2->getPersonName();

    std::cout << "明日穿搭:" << std::endl;//明天有点冷,小明要穿多一件外套

    p2->upDress();

    p2->downDress();

}

输出结果:

9aa802e27465427fa91b80a90eb4b5c2.png

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值