ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-05-09 18:00:23  阅读:186  来源: 互联网

标签:11 const C++ 织入 Base AOP Output include 轻量级


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有