大话设计模式-Study-Tips-第三章-装饰模式
2017-07-29 15:41
447 查看
一、UML图
二、包含的角色
(1)Component是一个对象接口,可以给对象动态的添加职责(2)ConcreteComponent 定义了一个具体的类,可以给这个类添加一些职责
(3)Decorater 为装饰的抽象类,继承了Component,从外类来扩展Component的功能,但对于Component来说。是无需知道Decorater的存在的
(4)ConcreteDecorater为装饰的具体类,起到给Component添加职责的功能。
三、特点
定义:装饰模式(Decorater),动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。(1)装饰模式是为已有功能动态的添加更多功能的一种方式
(2)当系统需要新功能的时候,是向旧的类中添加新的代码,这些代码通常装饰了原有类的核心职责或主要行为。在主类中加入新的字段,新的方法和新逻辑,增加了主类的复杂度,但是这些新加入的东西仅仅是为了满足 一些只在某种特定 情况下才会执行的特殊行为的需求。而装饰模式提供了一种好的解决方案,把每个需要装饰的功能封装在单独的类中,并让这个类去包装它所要装饰的对象,因此,执行特殊行为时候,客户代码就可以在运行时根据需要,选择的,按顺序的使用装饰功能包装对象。
优点:把类的装饰功能从类中搬走,降低了主类的复杂度,有效的将类的核心功能和修饰功能分离,而且可以去除相关类中重复的修饰逻辑。
使用场合:
(1)需要在内部组装完成显示出来的情况。
(2)装饰模式的建造过程不稳定。
(3)我们需要把所需的功能按正确的顺序串联起来进行控制。
四、代码实现
C# 实现Component类
public abstract class Component { public abstract void Operation(); }ConcreteComponent 类
public class ConcreteComponent : Component { public override void Operation() { Console.WriteLine("具体对象的操作"); } }Decorater 类
public abstract class Decorater : Component { protected Component component; public override void Operation() { if (component!=null) { component.Operation(); } } public void SetComponent(Component component) { this.component = component; } }ConcreteDecorater类 这里只写一个。其他的同理
public class ConcreteDecoraterA : Decorater { private int Attribute ; public override void Operation() { base.Operation(); Attribute = 111; } }调用方式:
static void Main(string[] args) { ConcreteComponent c = new ConcreteComponent(); ConcreteDecoraterA d1 = new ConcreteDecoraterA(); ConcreteDecoraterB d2 = new ConcreteDecoraterB(); d1.SetComponent(c); d2.SetComponent(d1); d2.Operation(); Console.WriteLine("Hello World!"); }
C++实现
Component类
class Component { public: virtual void Operation() = 0; };ConcreteComponent类
class ConcreteComponent : public Component { public: void Operation(); };
Dectorater类
Dectorater.h
#include "Component.h" class Decorater : public Component { private: Component* _component; public: void Operation(); void SetComponent(Component* component); };Dectorater.cpp
#include "Decorater.h" void Decorater::Operation() { if (_component!=NULL) { _component->Operation(); } } void Decorater::SetComponent(Component * component) { _component = component; }
ConcreteDecorater类
#include "Decorater.h" class ConcreteDecoraterA : public Decorater { public: void Operation(); private: int Attribute; };
void ConcreteDecoraterA::Operation() { Decorater::Operation(); printf("2"); }
调用方式
#include "ConcreteComponent.h" #include "ConcreteDecoraterA.h" #include "ConcreteDecoraterB.h" int main() { ConcreteComponent* cC = new ConcreteComponent(); ConcreteDecoraterA* cDa = new ConcreteDecoraterA(); ConcreteDecoraterB* cDb = new ConcreteDecoraterB(); cDa->SetComponent(cC); cDb->SetComponent(cDa); cDb->Operation(); return 0; }
相关文章推荐
- 大话设计模式-Study-Tips-第四章-代理模式
- 大话设计模式-Study-Tips-第二章-策略模式
- 大话设计模式——装饰模式
- 大话设计模式C++版——装饰模式
- 大话设计模式-装饰模式
- 大话设计模式--6.装饰模式
- 大话设计模式(golang) 三、装饰模式
- 我也大话设计模式--装饰模式
- 《大话设计模式》之 装饰模式 Delphi实现
- 《大话设计模式》——读后感 (6)穿什么有这么重要?——装饰模式
- 三、大话设计模式 之 装饰模式
- 《大话设计模式》--穿什么有这么重要?--装饰模式<Decorator>(6)
- 大话设计模式学习(一)----装饰模式
- 《大话设计模式》读书笔记(C++代码实现) 第六章:装饰模式
- 《大话设计模式》学习笔记3:装饰模式
- 大话设计模式-装饰模式学习总结
- 大话设计模式(Python版)--装饰器模式
- 《大话设计模式》——装饰模式
- 大话设计模式之装饰模式