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

原创 2015年11月20日 21:16:03

一个实例


这里写图片描述

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

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

class IHello
{
public:
    virtual ~IHello() {}       // 将多态基类的析构函数声明为virtual
    virtual 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将程序的非核心逻辑都“横切”出来,将非核心逻辑和核心逻辑分离,使我们集中精力在核心逻辑上。

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

设计模式——装饰模式(Decorator)

要想正确理解设计模式,首先必须明确它是为了解决什么问题而提出来的。 设计模式学习笔记 ——Shulin 转载请注明出处:http://blog.csdn.net/zhshulin 1、概念 ...
  • u012909091
  • u012909091
  • 2014年08月18日 20:23
  • 17873

面向接口编程的设计模式

面向接口编程的设计模式简单工厂模式 假设程序中有个Computer类需要组合一个输出设备,现在有两个选择:直接让Computer类组合一个Printer,或者让Computer类组合一个Output,...
  • greenlihui
  • greenlihui
  • 2017年03月13日 13:18
  • 875

白话设计模式之--面向切面的编程

了解完设计模式之后,本人接触到了面向切面编程。其实设计模式本身更多的是一种思想。因此我觉得你掌握某些书中的一些例子没有什么用处,更重要的是要掌握思想精髓,然后能在实际的项目中来进行应用。我们做开发的时...
  • jike0901xuye
  • jike0901xuye
  • 2015年08月12日 09:02
  • 583

AOP(面向切片编程)

AOP(面向切片编程)
  • u013565099
  • u013565099
  • 2017年04月15日 20:58
  • 199

设计模式 装饰者模式 带你重回传奇世界

今天继续设计模式之旅,给大家带来装饰者模式,国际惯例,先看定义。 装饰者模式:若要扩展功能,装饰者提供了比集成更有弹性的替代方案,动态地将责任附加到对象上。 先简单描述下装饰者模式发挥作用的地方,当我...
  • lmj623565791
  • lmj623565791
  • 2014年04月21日 20:21
  • 17324

设计模式--装饰者模式与代理模式

这次主要总结下装饰着模式和代理模式,这两个一起进行总结,主要是因为两个设计模式特别的类似。先依次说一下两个设计模式,然后再说下两个模式的不同。...
  • u013159433
  • u013159433
  • 2016年05月25日 17:11
  • 833

面向切面编程的两种实现

1、面向切面的定义自行百度 2、面向切面编程的应用场景自己想象,大概就是日志之类的地方 3、上面两句话基本是废话 实现方式一,在XML中声明切面 1、编写一个原始类...
  • AlbenXie
  • AlbenXie
  • 2017年05月27日 17:24
  • 351

面向对象的设计模式(十),代理模式

代理模式也称委托模式,是结构型设计模式之一,在实际应用中使用非常广泛,因此我们必须掌握这个设计模式。定义:为一个对象提供一个代理对象,通过这个代理对象控制这个对象的行为。使用场景: 直接访问或者控制对...
  • ydxlt
  • ydxlt
  • 2016年01月04日 16:44
  • 12083

浅谈JAVA设计模式之——装饰模式(Decorator)

一、概述 动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。 二、适用性 1.在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。 2.处...
  • l1028386804
  • l1028386804
  • 2015年05月03日 23:56
  • 1850

面向对象开发与面向对象设计模式的几个核心的思想和概念 -java

>>>> 面向对象开发的几个核心思想 1、问题领域、对象、属性、状态、行为、方法、实现 问题领域:   指软件系统所模拟的真实世界中的系统,在现实生活中,比较常见的比如,税收、社保、银行、商...
  • ShareUs
  • ShareUs
  • 2016年03月21日 17:10
  • 2571
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++设计模式::装饰模式or代理模式or面向切片编程(AOP)
举报原因:
原因补充:

(最多只允许输入30个字)