装璜器模式(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;}