C++11实现一个轻量级的AOP框架
作者:互联网
AOP介绍
AOP(Aspect-Oriented Programming,面向方面编程),可以解决面向对象编程中的一些问题,是OOP的一种有益补充。面向对象编程中的继承是一种从上而下的关系,不适合定义从左到右的横向关系,如果继承体系中的很多无关联的对象都有一些公共行为,这些公共行为可能分散在不同的组件、不同的对象之中,通过继承方式提取这些公共行为就不太合适了。使用AOP还有一种情况是为了提高程序的可维护性,AOP将程序的非核心逻辑都“横切”出来,将非核心逻辑和核心逻辑分离,使我们能集中精力在核心逻辑上,例如图1所示的这种情况。
实现AOP的一些方法
实现AOP的技术分为:静态织入和动态织入。静态织入一般采用抓们的语法创建“方面”,从而使编译器可以在编译期间织入有关“方面”的代码,AspectC++就是采用的这种方式。这种方式还需要专门的编译工具和语法,使用起来比较复杂。我将要介绍的AOP框架正是基于动态织入的轻量级AOP框架。动态织入一般采用动态代理的方式,在运行期对方法进行拦截,将切面动态织入到方法中,可以通过代理模式来实现。下面看看一个简单的例子,使用代理模式实现方法的拦截,如代码所示。
#include<memory>
#include<string>
#include<iostream>
using namespace std;
class Base
{
public:
Base()
{
}
virtual ~Base()
{
}
virtual void Output(const string& str)
{
}
};
class Derived : public Base
{
public:
void Output(const string& str) override
{
cout <<str<< endl;
}
};
class Aspect : public Base
{
public:
Aspect(Base* p) : m_ptr(p)
{
}
~Aspect()
{
delete m_ptr;
m_ptr = nullptr;
}
void Output(const string& str) final
{
cout <<"Before real Output"<< endl;
m_ptr->Output(str);
cout <<"After real Output"<< endl;
}
private:
Base* m_ptr;
};
void TestAspect()
{
std::shared_ptr<Base> obj1 = std::make_shared<Aspect>(new Derived());
obj1->Output("It is obj1 test");
}
int main(int argc, char const *argv[])
{
TestAspect();
return 0;
}
输出结果:
标签:11,const,C++,织入,Base,AOP,Output,include,轻量级 来源: https://www.cnblogs.com/codebai/p/16250191.html