编程语言
首页 > 编程语言> > C++11实现一个轻量级的AOP框架

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