首页 > 代码库 > 设计模式实现C++ --装饰模式Decorator Pattern
设计模式实现C++ --装饰模式Decorator Pattern
定义:动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
类图:
Component:定义一个对接接口,可以给这些对象动态的添加职责;
ConcreteComponent:定义一个具体的对象,也可以给对象添加一些职责;
Decorator:装饰抽象类,继承了Component,从外类来扩展Component类的功能,对于Component来说无需知道Decorator的存在;
ConcreteDecorator:具体的装饰对象,起到给Component添加职责的功能;
装饰者和被装饰者之间必须是一样的类型,也就是要有共同的超类。在这里应用继承并不是实现方法的复制,而是实现类型的匹配。因为装饰者和被装饰者是同一个类型,因此装饰者可以取代被装饰者,这样就使被装饰者拥有了装饰者独有的行为。根据装饰者模式的理念,我们可以在任何时候,实现新的装饰者增加新的行为。如果是用继承,每当需要增加新的行为时,就要修改原程序了。
实例:在展示新闻的同时给读取出来的新闻的人气加一,同时把新闻标题加入到RSS中,如果是用继承,就要往超类中增加相应的方法,如果是一个新增行为还是可以忍受的,如果此模块有不断增加业务的可能,那是不是要每次都要修改原程序呢?我想所有的朋友都不希望这样做。我们希望当有新的行为时才往旧对象上加,是在运行时加,并不是一开始就加。
//#ifdef COMPONENT_NEW_H//#define COMPONENT_NEW_H#include <iostream>#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 <iostream>#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)有效地把类的核心功能区分开,去除类中重复的装饰逻辑;
设计模式实现C++ --装饰模式Decorator Pattern
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。