共计 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;
}
正文完