关闭

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

标签: c++AOP
2053人阅读 评论(1) 收藏 举报
分类:

     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;
}

执行结果:




1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:5137次
    • 积分:116
    • 等级:
    • 排名:千里之外
    • 原创:7篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    文章分类
    最新评论