首页 » 开发 » 装饰器模式

装饰器模式介绍

装饰器模式(Decorator)可以在不改变当前类层次结构的前提下,添加新功能。

典型的使用例子如:

  1. 游戏中,为角色添加新的装备(防御、攻击)。
  2. UI中,让同一个元素呈现不同的显示效果。如Window,修饰以圆边框、方边框等。

装饰器模式实例 - 游戏装备

说明

以下是为游戏设计装备。

游戏中有几种角色:武士(Warrior)、巫师(Wizard)、弓箭手(Archer)。游戏中还有几种装备,如帽子(Hat)、衣服(Cloth)、靴子(Shoe),当角色受到攻击时(attacked),先由各种防御装备抵消伤害。类图如下:

装饰器模式

C++代码

基类Role:

class Role
{
    public:
        virtual ~Role() {}
        virtual void attacked() = 0;
};

武士继承于Role:

class Warrior : public Role
{
    public:
        ~Warrior() { cout << " Warrior dtor "; }
        virtual void attacked() { cout << " Warrior attacked "; }
};

装备的基类,也就是装饰器的关键Decorator类:

class Decorator : public Role
{
    public:
        Decorator(Role* r) { _role = r; }
        ~Decorator() {
            delete _role;
        }
        virtual void attacked() { _role->attacked(); }
    private:
        Role* _role;
};

Decorator类继承自Role,它的构造函数接受一个Role类的指针。

各种具体的装备,继承自Decorator:

class Hat : public Decorator
{
    public:
        Hat(Role* r) : Decorator(r) { }
        ~Hat() { cout << " Hat dtor ";  }
        virtual void attacked() {
            cout << " Hat attacked ";
            Decorator::attacked();
        }
};

class Cloth: public Decorator
{
    public:
        Cloth(Role* r) : Decorator(r) { }
        ~Cloth() { cout << " Cloth dtor ";  }
        virtual void attacked() {
            cout << " Cloth attacked ";
            Decorator::attacked();
        }
};
class Shoe : public Decorator
{
    public:
        Shoe(Role* r) : Decorator(r) { }
        ~Shoe() { cout << " Shoe dtor ";  }
        virtual void attacked() {
            cout << " Shoe attacked ";
            Decorator::attacked();
        }
};

然后写一段代码测试装饰器模式:

int main()
{
    Role* warrior = new Shoe(new Cloth(new Hat(new Warrior)));
    warrior->attacked();
    cout << "\n";
    delete warrior;
    cout << "\n";
    return 0;
}

程序输出:

Shoe attacked  Cloth attacked  Hat attacked  Warrior attacked 
Shoe dtor  Cloth dtor  Hat dtor  Warrior dtor 

可见依次是鞋子、衣服、帽子收到攻击,低效攻击效果,并最后由武士承受攻击。

分享

0