`

装饰者模式(Decorator)

阅读更多
装饰者模式:动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。

动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活

要点
1.继承属于扩展形式之一,但不见得是达到弹性设计的最佳方式
2.应该允许行为可以被扩展,而无须修改现有的代码
3.组合和委托可用于在运行时动态地加上新的行为
4.装饰者模式意味着一群装饰者类,这些类用来包装具体组件
5.装饰者类反映出被装饰的组件类型(事实上,他们具有相同的类型,都经过接口或继承实现)
6.装饰者被装饰者的行为前面与/或后面加上自己的行为,甚至将被装饰者的行为整个取代掉,而达到特定的目的
7.你可以用无数个装饰者包装一个组件
8.装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具体类型
9.装饰者会导致设计中出现许多小对象,如果过度使用,会让程序变得复杂

设计原则:类应该对扩展开放,对修改关闭。




Beverage.h
#ifndef BEVERAGE_H
#define BEVERAGE_H

#include<string>
using namespace std;

enum SIZE{
    SMALL,
    MIDDLE,
    BIG
};

class Beverage{
public:
    explicit Beverage(SIZE size=MIDDLE):mDescription("unknown"),mSize(size){

    }
    virtual string getDescription()const{
        return mDescription;
    }
    virtual double cost(){
        return 0;
    }
    virtual SIZE getSize()const{
        return mSize;
    }
private:
    string mDescription;
    SIZE mSize;
};

#endif // BEVERAGE_H


CondimentDecorator.h
#ifndef CONDIMENTDECORATOR_H
#define CONDIMENTDECORATOR_H
#include"Beverage.h"
class CondimentDecorator:public Beverage{
public:
    virtual string getDescription()const=0;
};

#endif // CONDIMENTDECORATOR_H

HouseBlend.h
#ifndef HOUSEBLEND_H
#define HOUSEBLEND_H
#include"Beverage.h"
class HouseBlend:public Beverage{
public:
    explicit HouseBlend(SIZE size=MIDDLE)
        :mDescription("HouseBlend"),mPrice(1.2),mSize(size){

    }
    virtual string getDescription()const{
        return mDescription;
    }
    SIZE getSize()const{
        return mSize;
    }
    virtual double cost(){
        switch(getSize()){
            case SMALL:
                mPrice*=1;
                break;
            case MIDDLE:
                mPrice*=1.2;
                break;
            case BIG:
                mPrice*=1.5;
                break;
        }
        return mPrice;
    }
private:
    string mDescription;
    double mPrice;
    SIZE mSize;
};

#endif // HOUSEBLEND_H


Milk.h
#ifndef MILK_H
#define MILK_H

#include"CondimentDecorator.h"
class Milk:public CondimentDecorator{
public:
    explicit Milk(Beverage* bvg):mDescription("Mile"),mBvg(bvg),mPrice(0.5){

    }
    string getDescription()const{
        return mBvg->getDescription()+","+mDescription;
    }
    double cost(){
        switch(mBvg->getSize()){
            case SMALL:
                mPrice*=1;
                break;
            case MIDDLE:
                mPrice*=1.2;
                break;
            case BIG:
                mPrice*=1.5;
                break;
        }
        return mBvg->cost()+mPrice;
    }
private:
    string mDescription;
    Beverage* mBvg;
    double mPrice;
};

#endif // MILK_H


Mocha.h
#ifndef MOCHA_H
#define MOCHA_H

#include"CondimentDecorator.h"
class Mocha:public CondimentDecorator{
public:
    explicit Mocha(Beverage* bvg):mDescription("Mocha"),mBvg(bvg),mPrice(0.4){

    }
    string getDescription() const{
        return mBvg->getDescription()+","+mDescription;
    }
    double cost(){
        switch(mBvg->getSize()){
            case SMALL:
                mPrice*=1;
                break;
            case MIDDLE:
                mPrice*=1.2;
                break;
            case BIG:
                mPrice*=1.5;
                break;
        }
        return mBvg->cost()+mPrice;
    }
private:
    string mDescription;
    Beverage* mBvg;
    double mPrice;
};

#endif // MOCHA_H


main.cpp
#include"Milk.h"
#include"HouseBlend.h"
#include"Mocha.h"
#include<iostream>
using namespace std;

int main()
{
    Beverage* bvg1 = new HouseBlend(SMALL);//小杯
    cout << bvg1->getDescription() << ":" << bvg1->cost() << endl;
    bvg1 = new Milk(bvg1);//加了牛奶的饮料
    cout << bvg1->getDescription() << ":" << bvg1->cost() << endl;
    bvg1 = new Mocha(bvg1);//加了摩卡的饮料
    cout << bvg1->getDescription() << ":" << bvg1->cost() << endl;
}

HouseBlend:1.2
HouseBlend,Mile:1.7
HouseBlend,Mile,Mocha:2.18


当系统需要新功能的时候,是向旧的类中添加新的代码.这些新加的代码通常装饰了原有类的核心职责或主要行为.它们在主类中加入了新的字段,新的方法和新的逻辑,从而增加了主类的复杂度,而这些新加入的东西仅仅是为了满足一些只在某种特定情况下才会执行的特殊行为的需要.而装饰模式却提供了一个非常好的解决方案,它把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此,当需要执行特殊行为时,客户代码就可以在运行时根据需要有地,按顺序地使用装饰功能包装对象了


#include <iostream>
#include <string.h>
using namespace std;

class House
{
public:
    House()
    {
    }
    virtual ~House()
    {
    }
    virtual void display()
    {
        cout << "房子:";
    }
};

class FurnitureHouse:public House
{
public:
    FurnitureHouse()
    {
        memset(mStr,0,sizeof(mStr));
        strcpy(mStr,"床 ");
        strcat(mStr,"凳子 ");
    }
    virtual ~FurnitureHouse(){}
    virtual void display()
    {
        House::display();
        cout << mStr;
    }
public:
    char mStr[128];
};

class TVHourse:public FurnitureHouse
{
public:
    TVHourse(House* house)
    {
        mHouse = house;
        strcpy(furStr,"电视 ");
    }
    void display()
    {
        mHouse->display();
        cout << furStr;
    }
private:
    House* mHouse;

    char furStr[32];
};

class AirConditionHouse:public FurnitureHouse
{
public:
    AirConditionHouse(House* house)
    {
        mHouse = house;
        strcpy(furStr,"空调 ");
    }
    void display()
    {
        mHouse->display();
        cout << furStr;
    }
private:
    House* mHouse;

    char furStr[32];
};

int main()
{
    House* house = new FurnitureHouse;
    cout << "House:" << house << endl;
    house = new TVHourse(house);
    house->display();
    cout << "TVHouse:" << house << endl;
    house = new AirConditionHouse(house);
    house->display();
    cout << "AirConditionHouse:" << house << endl;
}

House:0x93b4978
房子:床 凳子 电视 TVHouse:0x93b4a00
房子:床 凳子 电视 空调 AirConditionHouse:0x93b4ab0
  • 大小: 55 KB
分享到:
评论

相关推荐

    装饰者模式——Decorator

    装饰者模式(Decorator)是一种设计模式,用于在运行时动态地给对象添加额外的责任或功能。它是结构型设计模式的一种,能将行为的增加与对象的创建分离,使得我们可以独立地扩展对象的功能。 在Java或其他面向对象...

    设计模式之装饰模式(Decorator Pattern)

    装饰模式(Decorator Pattern)是一种结构型设计模式,它在不改变原有对象的基础上,通过包裹一个对象并为其添加新的行为或责任,实现对对象功能的扩展。这种模式在软件开发中非常常见,尤其当需要在运行时动态改变...

    [结构型模式] head first 设计模式之装饰者模式(decorator)

    装饰者模式(Decorator Pattern)是结构型设计模式之一,它允许在运行时向对象添加新的行为或职责,而无需修改对象的源代码。这个模式的名字来源于装饰艺术,它通过添加额外的装饰来增强一个物体的外观,同样地,...

    装饰者模式(Decorator Pattern)原理图

    装饰者模式(Decorator Pattern)是一种结构型设计模式,它的定义是在不改变原有对象结构的基础上,动态地给该对象增加一些职责(即增加其额外功能)。这种模式允许向一个现有的对象添加新的功能,同时又不改变其...

    Head First 设计模式 (三) 装饰者模式(decorator pattern) C++实现

    装饰者模式(Decorator Pattern)是一种结构型设计模式,它允许我们向对象添加新的行为或职责,而无需修改对象的原始代码。在C++中实现装饰者模式,可以让我们灵活地扩展对象的功能,同时保持代码的可读性和可维护性...

    设计模式--装饰者模式java例子

    装饰者模式是软件设计模式中的一种结构型模式,它的主要目的是动态地给对象添加新的功能,而无需修改原有代码。在Java中,装饰者模式通常通过继承和组合来实现,它提供了一种比继承更灵活的方式来扩展对象的功能。...

    c++-设计模式之装饰模式(Decorator)

    装饰模式(Decorator Pattern)是一种结构型设计模式,允许在不改变对象接口的情况下,动态地为对象添加额外的职责或功能。装饰模式通常用于需要扩展对象功能而又不希望使用子类化的场景。 装饰模式的组成 组件接口...

    设计模式C++学习之装饰模式(Decorator)

    装饰模式(Decorator)是软件设计领域中一种非常实用的结构型设计模式,它允许我们向一个对象添加新的行为或责任,而无需修改该对象的源代码。在C++编程语言中,装饰模式常用于动态地扩展类的功能,使得类的行为在...

    PHP设计模式(八)装饰器模式Decorator实例详解【结构型】

    装饰器模式(Decorator Pattern)是一种结构型设计模式,主要用于在运行时动态地给对象添加新的职责或行为,而不必改变现有对象的类定义。在面向对象编程中,装饰器模式提供了一种相对于继承更加灵活的方式来增强或...

    Decorator装饰者模式

    在装饰者模式中,我们通常有两个主要的角色:Component(组件)和Decorator(装饰器)。Component是被装饰的对象接口,定义了所有装饰器和原始对象共同拥有的行为。Concrete Component是Component的具体实现,是实际...

    设计模式之装饰者(Decorator)

    装饰者模式是软件设计中的一种行为模式,它允许在运行时动态地给对象添加新的行为或职责,而无需改变对象的原始类。这种模式在不违反开闭原则的前提下,提供了扩展对象功能的能力,使得系统更加灵活,易于维护。 在...

    装饰器(Decorator)模式

    装饰器(Decorator)模式 装饰器(Decorator)模式是一种典型的结构型模式,主要用意是动态地为对象添加一些额外的功能。它提供了一个灵活的替代方案来继承子类,以扩展对象的功能。 在《Element of Reusable ...

    C#设计模式之Decorator 装饰模式

    装饰模式(Decorator Pattern)是设计模式中的一种结构型模式,它在不改变原有对象的基础上,通过添加额外的职责来扩展对象的功能。在C#中,装饰模式尤其适用于那些需要动态地增加或减少对象功能的情况,避免了使用...

    装饰者模式Demo

    装饰者模式是面向对象设计模式的一种,主要用于动态地给一个对象添加一些额外的职责,而不会改变该对象的类。这种模式允许我们独立于对象的类来扩展其功能,为对象增加新的行为或属性,同时保持了代码的可读性和可...

    结构型模式之装饰模式(Decorator)

    装饰模式(Decorator)是软件设计模式中的一种结构型模式,其主要目的是在不改变对象原有类的基础上,通过添加新的行为或职责来扩展对象的功能。这种模式使得代码的扩展性非常优秀,避免了由于频繁地使用继承而导致...

    装饰器模式[Decorator]

    装饰器模式(Decorator)是一种设计模式,它允许在运行时向对象添加新的行为或责任,而无需修改对象的源代码。这种模式属于结构型模式,是面向对象设计中的一种非常实用的技术。 装饰器模式的核心思想是通过将一个...

Global site tag (gtag.js) - Google Analytics