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将程序的非核心逻辑都“横切”出来,将非核心逻辑和核心逻辑分离,使我们集中精力在核心逻辑上。

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

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

相关文章推荐

C++ 实现 AOP(面向切面编程)

AOP(面向切面编程)是JAVA里面的技术,JAVA是通过反射机制来实现的,C++没有类似JAVA的反射机制,没办法像JAVA那样去实现。有些开源项目已经实现C++的AOP,例如AspectC++,但...

c++ 面向切面变成 aop 通用模板

#ifndef AOP_h #define AOP_h #define HAS_MEMBER(member)\ templatestruct has_member_##member\ {\ priva...
  • oZuoQi
  • oZuoQi
  • 2015年12月11日 11:17
  • 826

Java实现AOP面向切面编程的实例教程

这篇文章主要介绍了Java实现AOP面向切面编程的实例教程,通常Java中的AOP都是利用Spring框架中造好的轮子来开发,而本文则关注于Java本身AOP的设计模式实现,需要的朋友可以参考下 ...

C++11之AOP实现

AOP相信大家对面向对象编程一定都熟悉透了。面向对象编程的继承是一种从上而下的关系,不适合从左到右的横向关系,试想一下如果很多无关联的对象有公共的行为,这些公共的行为可能分散在不同组件和不同对象中,通...

大话设计模式-----(二)装饰模式、代理模式

我所理解的装饰模式 就是说像穿衣服或者说是炒菜加调料又或者是煎饼果子加蛋和火腿肠的问题先定义一个接口或者抽象类A,看她有没有初始的属性,有则用抽象类 。然后定义一个抽象类B继承或实现。 A中有最基...

【设计模式】 装饰模式与代理模式的对比

设计模式有23种,但是真正在设计的过程中可远不止23种之多.为了让软件的设计扩展性更高,使用设计模式是一种很好的方式之一.学了好几遍的设计模式,这一次再学习的时候,发现23种设计模式中有好多其实都很相...

菜鸟版JAVA设计模式—适配器模式,装饰模式,代理模式异同

菜鸟版JAVA设计模式—适配器模式,装饰模式,代理模式异同 标签: JAVA设计模式适配器模式装饰模式代理模式 说明 本文出处 :http://blog.csdn.net/lulei987...

菜鸟版JAVA设计模式—适配器模式,装饰模式,代理模式异同

节前把3个设计模式的学习心得分享了一下,分别是适配器模式,装饰模式,代理模式。 但是似乎越写越有些迷糊,这三种模式都有着一些大同小异的地方,总是有些搞不清。 今天再重新学习下,把学习心得分享给大家一下...

设计模式 - 适配器模式,装饰模式,代理模式,外观模式(一)

概述适配器模式(adapter pattern),装饰模式(decorator pattern),代理模式(proxy pattern)和外观模式( facade pattern),都是设计模式中结构...

23种设计模式--结构型模式(适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模式)

总体来说设计模式分为三大类:   创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。   结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++设计模式::装饰模式or代理模式or面向切片编程(AOP)
举报原因:
原因补充:

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