dhru商城网站建设,推荐几个安全没封的网站2021,网页版梦幻西游能赚钱吗,wordpress中文设置设计模式最大的作用就是在变化和稳定中间寻找隔离点#xff0c;然后分离它们#xff0c;从而管理变化。将变化像小兔子一样关到笼子里#xff0c;让它在笼子里随便跳#xff0c;而不至于跳出来把你整个房间给污染掉。 设计思想
动态地将责任附加到对象上#xff0c;若要扩… 设计模式最大的作用就是在变化和稳定中间寻找隔离点然后分离它们从而管理变化。将变化像小兔子一样关到笼子里让它在笼子里随便跳而不至于跳出来把你整个房间给污染掉。 设计思想
动态地将责任附加到对象上若要扩展功能装饰者提供了比继承更有弹性的替代方案。
装饰类继承自超类继承是为了有正确的类型而非继承超类的行为。
业务场景
假定你需要给蜜雪冰城设计一套售卖系统。他们家所有的饮料假设只有描述和价格两种属性你可能又会想到用继承去解决先抽象一个奶茶父类然后每种奶茶都继承该父类并实现各自的display和cost方法。
你很快就会发现这么做有很多麻烦首先这家奶茶店所有的奶茶种类加一起数量可能有几十种数百种这也就意味着你的子类会有很多很多其次这么设计似乎并不符合实际的业务场景人们点奶茶的时候并不是一成不变的有的不要珍珠有的双倍糖等等加的调料和份数也不一样那么最后如何描述这杯奶茶以及计算其价格就成了问题。
代码案例
#includeiostream
#i#includeiostream
#includevector
#includealgorithm
#include string
#include memory//饮料抽象类
class Beverage {
public:virtual ~Beverage() {};virtual std::string getDescription() 0;virtual double cost() 0;
protected:std::string description;};
//调料装饰者类
class Condimentecorator :public Beverage {
public:virtual ~Condimentecorator() {};virtual std::string getDescription() 0;
};//espresso 饮料类
class Espresso :public Beverage {
public:Espresso() :Beverage(){description Espresso;}std::string getDescription() { return description; }double cost() {return 1.99;}
};//houseblend 饮料类
class HouseBlend :public Beverage {
public:HouseBlend() :Beverage(){description HouseBlend;}std::string getDescription() { return description; }double cost() {return 0.89;}
};//DarkRoast 饮料类
class DarkRoast :public Beverage {
public:DarkRoast() :Beverage(){description DarkRoast;}std::string getDescription() { return description; }double cost() {return 0.99;}
};//Decat 饮料类
class Decat :public Beverage {
public:Decat() :Beverage(){description Decat;}std::string getDescription() { return description; }double cost(){return 1.05;}
};//Mocha调料装饰者
class Mocha :public Condimentecorator {public:Mocha(std::shared_ptrBeverage be) :Condimentecorator(), beverage(be) {}std::string getDescription() {return (beverage-getDescription() Mocha);}double cost(){return 0.2 beverage-cost();}public:std::shared_ptrBeverage beverage;
};//Soy调料装饰者
class Soy :public Condimentecorator {
public:Soy(std::shared_ptrBeverage be):Condimentecorator(),beverage(be){}std::string getDescription(){return (beverage-getDescription() Soy);}double cost(){return 0.15 beverage-cost();}
public:std::shared_ptrBeverage beverage;
};//Whip调料装饰者
class Whip :public Condimentecorator {
public:Whip(std::shared_ptrBeverage be) :Condimentecorator(), beverage(be) {}std::string getDescription(){return (beverage-getDescription() Whip);}double cost(){return 0.10 beverage-cost();}
public:std::shared_ptrBeverage beverage;
};int main()
{std::shared_ptrBeverage beverage std::make_sharedEspresso();std::cout beverage-getDescription() costs: beverage-cost() std::endl;std::shared_ptrBeverage beverage2 std::make_sharedDarkRoast();std::cout beverage2-getDescription() costs: beverage2-cost() std::endl;beverage2 std::make_sharedMocha(beverage2);std::cout beverage2-getDescription() costs: beverage2-cost() std::endl;beverage2 std::make_sharedMocha(beverage2);std::cout beverage2-getDescription() costs: beverage2-cost() std::endl;beverage2 std::make_sharedWhip(beverage2);std::cout beverage2-getDescription() costs: beverage2-cost() std::endl;auto it std::make_sharedWhip(beverage2);std::cout it-cost() it-getDescription() std::endl;std::cout it-beverage-cost() it-beverage-getDescription() std::endl;return 0;
}