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;
}
执行结果: