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

原创 2016年02月04日 12:28:32

     AOP(面向切面编程)是JAVA里面的技术,JAVA是通过反射机制来实现的,C++没有类似JAVA的反射机制,没办法像JAVA那样去实现。有些开源项目已经实现C++的AOP,例如AspectC++,但是它需要用到专门的编译器去编译,语法也不再是C++语法,用起来比较复杂,在此,我通过C++的特性来实现AOP。

实现原理:

        用一个类似智能指针的类(BaseAspect)来封装接口类(Action),调用的时候利用匿名对象生命周期的特性来实现AOP。

关键特性:

       1、C++对象的构造和析构函数的调用机制:对象创建的时候构造,对象销毁的时候析构。

       2、匿名对象的生命周期是在语句中的:在对象定义的时候创建,在语句结束的时候销毁。

实现代码:

1. Aspect.h

#ifndef ____ASPECT_H____
#define ____ASPECT_H____

template <class T>
class BaseAspect
{
	T* m_pT;

protected:
	BaseAspect(T* pT)
		: m_pT(pT)
	{
	}

	virtual ~BaseAspect()
	{
	}

public:

	T* operator->()
	{
		return m_pT;
	}
};


template <class T>
class LogAspect : public BaseAspect<T>
{
	const char* m_name;
public:
	LogAspect(T* pT, const char* name = "")
		: BaseAspect<T>(pT)
		, m_name(name)
	{
		std::cout<<"LogAspect: "<<m_name<<" begin"<<std::endl;
	}

	~LogAspect()
	{
		std::cout<<"LogAspect: "<<m_name<<" end"<<std::endl;
	}
};


template <class T>
class LockAspect : public BaseAspect<T>
{
public:
	LockAspect(T* pT)
		: BaseAspect<T>(pT)
	{
		std::cout<<"LockAspect: lock"<<std::endl;
	}

	~LockAspect()
	{
		std::cout<<"LockAspect: unlock"<<std::endl;
	}
};


#endif//____ASPECT_H____



2.main.cpp

#include <iostream>
using namespace std;

#include "Aspect.h"

class Action
{
public:
	void Say(const char* str)
	{
		std::cout<<"Action::Say( "<<str<<" )"<<std::endl;
	}
};


int main(int argc, char* argv[])
{
	Action a;
	LogAspect<Action>(&a, "Action::Say")->Say("Hi");

	std::cout<<std::endl;

	LockAspect<Action>(&a)->Say("Hello");

	while (1);
	return 0;
}

执行结果:




C++11之AOP实现

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

[C++之AOP]实战Aspect C++之检查内存泄漏

[C++之AOP]实战Aspect C++之检查内存泄漏前面简单介绍了Aspect C++,相信没人看出它有什么特别强大的地方。这次特别挑了一个合适的例子,检查内存泄漏。首先看一个普通的程序:1、te...
  • qgx2008
  • qgx2008
  • 2011-01-23 11:05:00
  • 1904

C++之AOP

C++之AOPAOP是近年炒得很热,但却用得很少的一门技术,不过这并不能阻止我去学习它。既然能一度炒得火热,必定有过人之处。说AOP是一种思想或许更适合一些,它并不描述哪一种专有的技术,也不指定实现方...
  • qgx2008
  • qgx2008
  • 2011-01-23 11:03:00
  • 1360

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

#ifndef AOP_h #define AOP_h #define HAS_MEMBER(member)\ templatestruct has_member_##member\ {\ priva...
  • oZuoQi
  • oZuoQi
  • 2015-12-11 11:17:12
  • 1005

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

一个实例 装饰模式:动态地给一个对象(而非一个类)添加一些额外的职责。就增加功能来说,装饰模式比创建子类更加灵活,因为有时我们的需求是给某个对象而不是整个类添加一些功能,比如为一部手机添加增加挂...
  • lanchunhui
  • lanchunhui
  • 2015-11-20 21:16:03
  • 1460

C++11实现一个轻量级的AOP框架

转载自:点击打开链接AOP介绍  AOP(Aspect-Oriented Programming,面向方面编程),可以解决面向对象编程中的一些问题,是OOP的一种有益补充。面向对象编程中的继承是一种从...
  • woshiyuanlei
  • woshiyuanlei
  • 2018-01-18 19:11:13
  • 178

c++简易AOP框架

#include &amp;lt;iostream&amp;gt; #include &amp;lt;chrono&amp;gt; #include &amp;lt;ctime&amp;gt; #in...
  • linside1022
  • linside1022
  • 2018-02-14 16:38:37
  • 51

面向切面编程(3):AOP实现机制

1 AOP各种的实现 AOP就是面向切面编程,我们可以从几个层面来实现AOP。
  • zhoudaxia
  • zhoudaxia
  • 2014-06-23 22:28:08
  • 2590

轻松理解AOP(面向切面编程)

本文主要介绍AOP思想,而不是Spring,Spring在本文只做为理解AOP的工具和例子,所以也不打算介绍Spring的Aspect、Join point、Advice、AOP proxy等概念,那...
  • haluoluo211
  • haluoluo211
  • 2016-07-27 16:38:56
  • 1159

面向方面编程的Aop介绍

  • 2010年07月25日 14:56
  • 131KB
  • 下载
收藏助手
不良信息举报
您举报文章:C++ 实现 AOP(面向切面编程)
举报原因:
原因补充:

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