设计模式--装饰模式(Decorate)
2011-07-21 15:23
253 查看
1.例子
需求:设计一套生产冰激凌的系统,以满足顾客以下几种需求:水果冰激凌、奶酪冰激凌、巧克力冰激凌。。。 新的需求:水果奶酪冰激凌、奶酪水果巧克力冰激凌。。。 请注意食品添加的顺序~2.定义
动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更加灵活。3.类图
Component是定义一个对象接口,可以给这些对象动态地添加职责。ConcreteComponent是定义了一个具体的对象,也可以给这个对象添加一些职责。 Decorator,装饰抽象类,继承了Component,从外类来扩展Component类的功能,但对于Component来说,是无需知道Decorator的存在的。 至于ConcreteDecorator就是具体的装饰对象,起到给Component添加职责的功能。
4.优缺点
4.1优点
装饰类和被装饰类可以独立发展,而不会相互耦合。换句话说,Component类无需知道Decorator类,Decorator类从外部来扩展Component类得功能,而Decorator也不用知道具体的构件。装饰模式是继承关系的一个替代方案。我们看装饰类Decorator,不管装饰多少层,返回的对象还是Component,实现的还是is-a的关系。
装饰模式可以动态地扩展一个实现类的功能。
4.2.缺点
多层的装饰比较复杂。就像剥洋葱一样,剥到最后才发现是最里层的装饰出现了问题,因此应该尽量减少装饰类的数量,以便降低系统的复杂度。5.使用场景
需要扩展一个类的功能,或给一个类增加附加功能。需要动态地给一个对象增加功能,这些功能可以再动态地撤销。
需要为一批兄弟类进行改装或加装功能,当然是首选装饰模式。
6.总结
当系统需要新功能的时候,是向旧的类中添加新的代码。这些新加的代码通常装饰了原有类得核心职责或主要行为,它们在主类中加入了新的字段,新的方法和新的逻辑,从而增加了主类的复杂度。而这些新加入的东西仅仅是为了满足一些只在某种特定情况下才会执行的特殊行为的需要。而装饰模式却提供了一个非常好的解决方案,它把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此,当需要执行特殊行为时,客户代码就可以在运行时根据需要有选择地、按顺序地使用装饰功能包装对象了。最大的好处就是有效地把类得核心职责和装饰功能区分开了,而且可以去除相关类中重复的装饰逻辑。例 #include <string> #include <iostream> using namespace std; //人 class Person { private: string m_strName; public: Person(string strName) { m_strName=strName; } Person(){} virtual void Show() { cout<<"装扮的是:"<<m_strName<<endl; } }; //装饰类 class Finery :public Person { protected: Person* m_component; public: void Decorate(Person* component) { m_component=component; } virtual void Show() { m_component->Show(); } }; //T 恤 class TShirts: public Finery { public: virtual void Show() { cout<<"T Shirts"<<endl; m_component->Show(); } }; //裤子 class BigTrouser :public Finery { public: virtual void Show() { cout<<" Big Trouser"<<endl; m_component->Show(); } }; //客户端 int main() { Person *p=new Person("小李"); BigTrouser *bt=new BigTrouser(); TShirts *ts=new TShirts(); bt->Decorate(p); ts->Decorate(bt); ts->Show(); return 0; }
相关文章推荐
- 设计模式之装饰模式(Decorate Pattern)
- 设计模式--装饰模式Decorate(结构型)
- 设计模式(十):装饰模式Decorate(结构型模式)
- 设计模式之装饰器模式(Decorator)
- 设计模式:装饰器模式(为对象动态的添加功能)
- Kotlin设计模式 - 装饰器模式(Decorator)
- 黑马程序员:装饰设计模式介绍及装饰模式与继承关系的区别
- Java设计模式--装饰模式
- 设计模式之装饰模式(Decorator Pattern)
- java设计模式之装饰模式(装饰器模式/装饰者模式)
- .net设计模式之装饰模式
- 设计模式之装饰模式(笔记)
- php设计模式20-装饰着模式
- 设计模式之装饰模式(C++实现)
- 设计模式(4)---装饰模式
- 设计模式--3装饰对象
- 设计模式(六)装饰模式(转)
- java 23 种设计模式 07装饰模式
- 设计模式——装饰模式
- 设计模式之装饰模式;