设计模式之装饰模式-C++

装饰模式:动态的将责任附加到对象上。

特点:1、采用组合的方式。2、装饰者和被装饰者都具有同样的超类。

缺点:1、会产生很多的小类,代码看起来会比较复杂。

通过上面的描述,装饰者模式应该具有四种类型的类:

一、超类。是装饰者和被装饰者都要继承的基类。

二、具体的被装饰者类。

三、抽象的装饰者。

四、具体的装饰者。

下面以奶茶店的奶茶来进行描述:

首先,我们定义一个超类,来描述这个奶茶具有的通用特性。

1、奶茶需要卖的价格。 2、是何种类型的奶茶。

class TeaMilk

{

        string getTeaMilkDescription(); //比如是水果奶茶,牛奶奶茶等。

        virtural double cost() = 0;  //这个奶茶需要卖多少

}; 

2、具体的被装饰类 。定二个具体的类,一个为水果奶茶,一个为牛奶奶茶

class FruitsTeaType :public TeaMilk

{

        public:

        FruitsTeaType();

        ~FruitsTeaType ();

        string getTeaMilkDescription(); //描述

        double cost(); //价格

};

class  MilkTeaType : public TeaMilk

{

        public:

        MilkTeaType();

        ~MilkTeaType();

        string getTeaMilkDescription(); //描述

        double cost(); //价格

}

3、装饰的抽象类。 这个抽象类,主要是用来动态绑定,由父类指向不同的子类。

class CondimentDecorator : public TeaMilk

{

        virtual string getTeaMilkDescription(); //描述

};

4、具体的装饰者. 比如给奶茶加 柠檬(lenmon),加奶油(whip)等

class Lenmon : public CondimentDecorator

{

        public:

        Lenmon(TeaMilk *tea); //注意,构造类需要传入需要装饰的对象。

        ~Lenmon();

        string getTeaMilkDescription(); //描述

        double cost(); //价格

}

//注意在实现的时候,一定要先获取传入的装饰者对象,然后在装饰者的基础上进行增加。

class Whip : public CondimentDecorator

{

        public:

        Whip (TeaMilk *tea); //注意,构造类需要传入需要装饰的对象。

        ~Whip ();

        string getTeaMilkDescription(); //描述

        double cost(); //价格

}

示例显示

int main()

{

        TeaMilk *fruitsType = new FruitsTeaType(); //水果类型的奶茶。

        MilkTeaType *milkType = new MilkTeaType(); //牛奶类型的奶茶

        //加了奶油的水果茶价格

        TeaMilk *fruitsWhip = new Whip(fruitsType );

        furitsWhip.cost(); //水果奶油茶价格

        //加了奶油和柠檬的水果茶价格

        TeaMilk *allFruits = new Lenmon (fruitsWhip );

        allFruits.cost(); //加了奶油和柠檬的价格

        

        return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
装饰器模式(Decorator Pattern)是一种结构型设计模式,它允许向一个现有的对象添加新的功能,同时又不改变其结构。这种模式通过创建一个装饰来包装原始的,从而实现动态地扩展一个对象的功能。装饰和被装饰可以独立发展,它们之间没有耦合关系。装饰器模式是继承一个替代模式,它避免了使用继承来扩展对象功能所带来的静态特性。 在C++,可以通过使用抽象和具体来实现装饰器模式。首先创建一个抽象(比如Shape)作为基类,然后创建具体的(比如Circle和Rectangle)作为子。这些子实现了抽象的纯虚函数(比如draw),分别表示不同的图形。 在使用装饰器模式时,我们可以创建一个装饰,它也是抽象的子,并且它的对象包含一个抽象对象的指针。装饰可以在原始对象的基础上添加额外的功能,同时保持原始对象的接口不变。通过使用装饰器模式,我们可以动态地扩展一个对象的功能,而无需修改原始对象的结构。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [C++设计模式:装饰器模式](https://blog.csdn.net/m0_73443478/article/details/129751085)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dreamliweiming

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值