关于设计模式:设计模式系列-装饰器模式

3次阅读

共计 1261 个字符,预计需要花费 4 分钟才能阅读完成。

装璜器模式(DECRATOR):为了实现动静的给对象增加职能,即从内部给对象增加相干职能。能够这样了解,比如说一个 Person 类,该类的操作有能吃、能睡、能跑、但如果随着人类的进化,某一天 Person 能飞了,能在水里游了等等,依照个别的写法是批改 Person 这个类,给这个类增加上能飞,能游等操作,然而这样毁坏了面向对象的凋谢 - 关闭准则(对批改关闭,对拓展开发,有趣味的能够查看相干文献), 且随着人类的进化这个类就会变得越来越臃肿,越来越简单,增加任何一个性能都必须对这个臃肿的类进行批改,出错的概率大大晋升,且容易影响老性能,而装璜器模式能够解决这类问题,装璜器从内部给类增加职能,而不必去批改原始的类,拓展性好,可复用水平高。
UML 类图
cake 为一个形象对象,装璜器和具体须要被装璜的对象都继承自该形象对象,最重要的一点是 Decrator 保护了一个须要被装璜的对象的援用,从而达到为该对象增加职能的目标。

思考如下的例子:为一个蛋糕增加装璜。蛋糕店刚生产进去的蛋糕是最原始的,只是一个蛋糕原型,咱们须要再这个蛋糕上加上奶油,加上巧克力,加上瓜子仁,写上字等等,将原始蛋糕作为一个 Cake 类,咱们给这个 Cake 类的对象作装璜,为了不毁坏凋谢 - 关闭准则,也为了更好的拓展,咱们不能间接在 Cake 这个类里批改,而应该做一个有固定跟你的机器(装璜器), 通过装璜器来给这个蛋糕做装璜。

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

class cake{
public:
  virtual void getName();};

class mangoCake: class cake{void getname() overide {std::cout <<"this cake is made of mango";}
};

class decoratorCake: class cake{
public:
  decoratorCake(cake* cake){mcake_ = cake;}
private:
  cake* mcake_;
};

class chocolateDecorator: class decoratorCake {
public:
  void getName(){std::cout << mcake_->operation() << "" +"chocolate" ;
}
};

class creamDecorator: class decoratorCake {
public:
  void getName(){std::cout << mcake_->operation() << "" +"cream" ;
}
};

int main() {cake * mycake = new mangoCake();
    mycake->getName();
    mycake = new chocolateDecorator(mycake);
    mycake->getName();
    mycake = new creamDecorator(mycake);
    mycake->getName();
    
    delete cake;
    return 0;

}
正文完
 0