一个实例

装饰模式:动态地一个对象(而非一个类)添加一些额外的职责。就增加功能来说,装饰模式比创建子类更加灵活,因为有时我们的需求是给某个对象而不是整个类添加一些功能,比如为一部手机添加增加挂件、屏幕贴膜等等特性,一种比较灵活的方式,将手机(被装饰器类)嵌入到另一个对象(装饰器类)中(两者之间是一种组合关系),有这个对象(装饰器类)完成对象新特性的添加。

如上面的装饰器UML类图所示,装饰器类作为被装饰器类的兄弟类派生自同一个基类,二者接口一致,因此它对该组件的客户透明。图中我们也可以看到,用于装饰的装饰器类可以被独立出来,可单独发展,这无疑能够简化具体被修饰类的设计,使其专注于其核心功能的实现。

class IHello
{
public:virtual ~IHello() {}       // 将多态基类的析构函数声明为virtualvirtual void show() = 0;// 子类只有实现该接口才可进行对象的实例化工作
};class Hello :public IHello
{
private:std::string _name;
public:Hello(const std::string& name):_name(name){}void show() { std::cout << "hello " + _name << std::endl;}
};class HelloDecorator :public IHello
{
private:IHello* _hello;virtual void addDecorator() = 0;
public:HelloDecorator(IHello* hello):_hello(hello){}void show() { _hello->show();}
};class HelloDecoratorA :public HelloDecorator
{
private:void addDecorator() { std::cout << "logging in ..." << std::endl;}
public:HelloDecoratorA(IHello* hello):HelloDecorator(hello){}void show(){addDecorator();HelloDecorator::show();}
};class HelloDecoratorB :public HelloDecorator
{
private:void addDecorator() { std::cout << "logging out ..." << std::endl;}
public:HelloDecoratorB(IHello* hello):_hello(hello){}void show() {HelloDecorator::show();addDecorator();}
};int main(int, char**)
{
// shard_ptr<IHello>统一使用基类智能指针,进行堆对象的管理std::shared_ptr<IHello> hello(new Hello("Inside Zhang"));std::shared_ptr<IHello> helloA(new HelloDecoratorA(hello.get()));std::shared_ptr<IHello> helloB(new HelloDecoratorB(hello.get()));std::shared_ptr<IHello> helloAB(new HelloDecoratorB(helloA.get()));
//  helloA->show();
//  helloB->show();helloAB->show();return 0;
}

这不由得让人联想起装饰器模式与面向切面编程(Aspect Oriented Programming,AOP)的相似性,当我看到一本书中介绍面相切面编程画了一样的UML类图时。面向切面编程是作为面向对象编程的有益补充而被引入的。

  1. AOP能够解决一些OOP中的一些问题,或者准确地说,是为了解决继承中存在的问题。

    比如,OOP中的继承是一种纵向的从基类到子类(自上而下)的关系,不适合定义从左到右的横向关系。当继承体系中的许多无关联的对象存在一些公共行为(比如增加打印日志的功能),这些公共行为可能分布在不同的组件不同的对象之中。通过继承方式来提取这些公共行为,这些核心业务逻辑之外的修饰性的功能,就显得力不从心了。

  2. AOP提高程序的可维护性。

    AOP将程序的非核心逻辑都“横切”出来,将非核心逻辑和核心逻辑分离,使我们集中精力在核心逻辑上。

可不可以将装饰器模式理解为面向切面编程思想的一种具体的实现方式呢?

C++设计模式::装饰模式or代理模式or面向切片编程(AOP)相关推荐

  1. 对设计模式的总结之装饰模式与代理模式

    前言 面向对象编程追求的本质-提高扩展性.可维护性.灵活性和复用性.合理利用面向对象6个原则,能够很好的达到要求.如何利用好就是至关重要的了,前人总结了23+个设计模式能够让初学者更容易学到其中的精髓 ...

  2. 设计模式学习之代理模式学习(一)

    设计模式学习之代理模式学习(一) 关于设计模式想必学习过Java语言的人都知道吧,当时对其进行深入学习的的人应该不是很多.在我看来设计方面的知识相比于框架应用配置等知识要有意思的多,并且设计模式的对一 ...

  3. 设计模式之静态代理模式实战

    转载自 设计模式之静态代理模式实战 静态代理模式很简单,代理类和实现类都实现相同的接口,然后通过代理类来调用实现类的方法. 如我们想保存用户信息之前打印用户信息,或者保存用户信息之后把这些信息缓存下来 ...

  4. 设计模式之蝉——代理模式上中

    代理模式的扩展 1 普通代理 :这种代理就是客户端只能访问代理角色,而不能访问真实角色.与设计模式之蝉--代理模式上 片基本差不多. (1)Subject抽象主题角色: (2)RealSubject具 ...

  5. 适配器模式 VS 装饰模式 VS 代理模式 一个狼外婆的故事串联起来

    适配器模式(连接):允许因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中. 装饰器模式(增强):原有的不能满足现有的需求,对原有的进行增强. 代理模式(限制): ...

  6. 每日一个设计模式之【代理模式】

    文章目录 每日一个设计模式之[代理模式] ☁️前言

  7. Spring→面向切面编程AOP、相关概念、通知Advice类型、配置切面切入点通知、AOP相关API、AOP代理类ProxyFactoryBean、AOP注解@AspectJ

    面向切面编程AOP CGLib AOP相关概念 Advice类型 Spring实现AOP Spring配置切面aspect 配置切入点pointcut 配置通知advice 配置通知参数 调用新的父类 ...

  8. Spring——面向切面编程(AOP)

    1 AOP概述   AOP 并不是 Spring 框架的专属名称,它的全称是 Aspect Oriented Programming ,意为:面向切面编程.   在程序运行某个方法的时候,不修改原始执 ...

  9. java切面编程 切面概念,面向切面编程(AOP)初探

    面向对象编程通过设计和语言本身提供的模块化.封装.继承.多态来实现软件复用.尽管OOP在建模以及实现复杂软件方面非常成功,它仍然有一些问题.面向切面编程(AOP)被认为是一项有前途的新技术,它通过对交 ...

最新文章

  1. C/C++/动态链接库DLL中函数的调用约定与名称修饰
  2. 荣耀20 Pro正面渲染图曝光:开孔全面屏设计+后置四摄
  3. android 正在上传动画,安卓系统上传文件动态显示进度条,进度条经常卡在99%有时也会卡住不显示完整的文字。...
  4. 因被曝严重漏洞,Avast紧急禁用其 JavaScript 引擎
  5. 另类DATAGRID数据编辑修改
  6. android6.0闪光灯源码,android手电筒+闪光灯基本源码_linux编程_linux公社-linux系统门户网站...
  7. java乘法代码_java九九乘法表代码
  8. opencv的lena项目,用android studio 3.6可以运行——drawable如何引入lena图片
  9. 求排列组合的两种方式 模板
  10. 用VS2005打开方案出现“此安装不支持该项目类型
  11. Spark Transformation转换算子和Action行动算子
  12. Python再夺冠,2020年度编程语言排行榜出炉
  13. js做的一个猜数字小游戏
  14. JBPM工作流(二)——数据库表说明
  15. 2023年产品经理需要考的证书,NPDP含金量真高
  16. “”与“==”的优先级谁更高?
  17. 2D游戏开发 - 配置SkyGameEngine2d环境
  18. 智慧油田-三维管网可视化信息平台
  19. 梦幻西游其他服务器显示重名,梦幻西游转区重名怎么办?梦幻西游转区重名改名要钱吗?...
  20. ue html编辑器获取纯文本,百度文本编辑器(Ueditor)怎么获取内容?

热门文章

  1. Hadoop与Spark的集群复制
  2. 计算机视觉三大会议——ICCV、ECCV和CVPR
  3. QT5之修改程序图标
  4. 图例放在图的外面_手把手教你绘制多个置信区间的森林图
  5. SQL Server DATEADD() 当前时间减7小时
  6. 如何用SQL为每一行均产生一个随机数
  7. LeetCode Single Number I / II / III
  8. BFC和haslayout(IE6-7)(待总结。。。)
  9. 《人人都可以创业》连载1:创业很简单,从心开始
  10. pyclewn调试带参数程序