定义:动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
类图:
Component:定义一个对接接口,可以给这些对象动态的添加职责;
ConcreteComponent:定义一个具体的对象,也可以给对象添加一些职责;
Decorator:装饰抽象类,继承了Component,从外类来扩展Component类的功能,对于Component来说无需知道Decorator的存在;
ConcreteDecorator:具体的装饰对象,起到给Component添加职责的功能;
装饰者和被装饰者之间必须是一样的类型,也就是要有共同的超类。在这里应用继承并不是实现方法的复制,而是实现类型的匹配。因为装饰者和被装饰者是同一个类型,因此装饰者可以取代被装饰者,这样就使被装饰者拥有了装饰者独有的行为。根据装饰者模式的理念,我们可以在任何时候,实现新的装饰者增加新的行为。如果是用继承,每当需要增加新的行为时,就要修改原程序了。
实例:在展示新闻的同时给读取出来的新闻的人气加一,同时把新闻标题加入到RSS中,如果是用继承,就要往超类中增加相应的方法,如果是一个新增行为还是可以忍受的,如果此模块有不断增加业务的可能,那是不是要每次都要修改原程序呢?我想所有的朋友都不希望这样做。我们希望当有新的行为时才往旧对象上加,是在运行时加,并不是一开始就加。
//#ifdef COMPONENT_NEW_H //#define COMPONENT_NEW_H #include#include <string> using namespace std; class Component_New { public: virtual void getNew() = 0; }; class DB_New:public Component_New { public: void getNew() { cout << "从数据库取得数据" << endl; } }; class XML_New: public Component_New { public: void getNew() { cout << "从XML取得数据" << endl; } }; class Decorator_New:public Component_New { public: Decorator_New(Component_New& componentnew) { _Component_New = &componentnew; } void getNew() { _Component_New->getNew(); } private: Component_New* _Component_New; }; class ConcreteDecorator_AddAmount:public Decorator_New { public: ConcreteDecorator_AddAmount(Component_New& componentnew) :Decorator_New::Decorator_New(componentnew) { // Decorator_New::Decorator_New(&componentnew); } void AddAmount() { cout << "新闻人气已经加一" << endl; } void getNew() { AddAmount(); Decorator_New::getNew(); } }; class ConcreteDecorator_AddRss:public Decorator_New { public: ConcreteDecorator_AddRss(Component_New& componentnew) :Decorator_New::Decorator_New(componentnew) {} void AddRss() { cout << "新闻标题已经加入到RSS中" << endl; } void getNew() { AddRss(); Decorator_New::getNew(); } };
#include#include "Component_News.h" int main() { Component_New* _Component_New = new DB_New(); Decorator_New* _Decorator_New = new ConcreteDecorator_AddAmount(*_Component_New); _Decorator_New = new ConcreteDecorator_AddRss(*_Decorator_New); _Decorator_New->getNew(); return 0; }
优点:
1)把类中装饰功能从类中搬移去除,这样可以简化原有的类;
2)有效地把类的核心功能区分开,去除类中重复的装饰逻辑;