时间:2021-05-19
由遇到的问题引出的装饰模式
在 OO 设计和开发过程,可能会经常遇到以下的情况:我们需要为一个已经定义好的类添加新的职责(操作),通常的情况我们会给定义一个新类继承自定义好的类,这样会带来一个问题(将在本模式的讨论中给出)。通过继承的方式解决这样的情况还带来了系统的复杂性,因为继承的深度会变得很深。
而装饰提供了一种给类增加职责的方法,不是通过继承实现的,而是通过组合。
有关这些内容在讨论中进一步阐述。
模式选择
装饰模式典型的结构图为:
在 结 构 图 中 , ConcreteComponent 和装饰需 要 有 同 样 的 接 口 , 因 此ConcreteComponent 和装饰有着一个共同的父类。这里有人会问,让装饰直接维护一个指向 ConcreteComponent 引用(指针)不就可以达到同样的效果,答案是肯定并且是否定的。肯定的是你可以通过这种方式实现,否定的是你不要用这种方式实现,因为通过这种方式你就只能为这个特定的 ConcreteComponent 提供修饰操作了,当有了一个新的ConcreteComponent 你 又 要 去 新 建 一 个装饰来 实 现 。 但 是 通 过 结 构 图 中 的ConcreteComponent 和装饰有一个公共基类,就可以利用 OO 中多态的思想来实现只要是 Component 型别的对象都可以提供修饰操作的类,这种情况下你就算新建了 100 个Component 型别的类 ConcreteComponent,也都可以由装饰一个类搞定。这也正是装饰模式的关键和威力所在了。
当然如果你只用给 Component 型别类添加一种修饰,则装饰这个基类就不是很必要了。
实例
#include <iostream> using namespace std; class TestA { public: void display_a() { cout<<"display a..."<<endl; } }; class TestB { public: void display_b() { cout<<"display b..."<<endl; } }; class Facade { TestA *testa; TestB *testb; public: Facade() { testa = new TestA(); testb = new TestB(); } ~Facade() { delete testa; delete testb; } void MethodA() { testa->display_a(); testb->display_b(); } }; int main() { Facade *facade = new Facade(); facade->MethodA(); system("pause"); return 0; }声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
说明:主要参考《HeadFirst设计模式(中文版)》,使用C#代码实现。代码:Github1、观察者模式UML图2、气象监测类图3、气象监测代码(书中C#版)
学设计模式中有个装饰模式,用java实现起来不是很难,但是远远没有python简单,难怪越来越火了!这里就简单讨论下python的几种装饰模式:一无参装饰器:#
设计模式之单例模式C++实现一、经典实现(非线程安全)classSingleton{public:staticSingleton*getInstance();p
本篇随笔主要介绍用Java实现简单的装饰器设计模式:先来看一下装饰器设计模式的类图:从图中可以看到,我们可以装饰Component接口的任何实现类,而这些实现类
原型模式的实现完整代码示例(code):原型模式的实现很简单,这里为了方便初学者的学习和参考,将给出完整的实现代码(所有代码采用C++实现,并在VC6.0下测试