C++11之AOP實現
阿新 • • 發佈:2019-02-03
AOP
相信大家對面向物件程式設計一定都熟悉透了。面向物件程式設計的繼承是一種從上而下的關係,不適合從左到右的橫向關係,試想一下如果很多無關聯的物件有公共的行為,這些公共的行為可能分散在不同元件和不同物件中,通過繼承實現一定是很不好的。那應該怎麼實現呢?對滴,就是我們今天要說的AOP面向方面程式設計,也可以說面向切面程式設計。
AOP的核心就是把軟體系統分為兩部分:核心關注點和橫切關注點。業務邏輯處理的主要流程是核心關注點,與之關係不大的則是橫切關注點。橫切關注點的一個特點是,他們經常發生在核心關注點的多處,而各處基本相似。典型的例子:許可權認證,日誌,事務處理。AOP就是分離這些關注點,將核心關注點和橫切關注點分離。
AOP靜態植入
#include "stdafx.h"
#include <string>
#include <memory>
#include <iostream>
using namespace std;
class IHello{
public:
IHello(){
}
virtual ~ IHello(){
}
virtual void Output(const string& str){
}
};
class Hello : public IHello
{
public :
void Output(const string& str) override{
cout << str << endl;
}
};
class HelloProxy: public IHello{
public:
HelloProxy(IHello* p):m_ptr(p){
}
~HelloProxy(){
delete m_ptr;
m_ptr = NULL;
}
void Output(const string& str) final{
cout << "Before real Output" << endl;
m_ptr->Output(str);
cout << "After real Output" <<endl;
}
private:
IHello * m_ptr;
};
int _tmain(int argc, _TCHAR* argv[])
{
std::shared_ptr<IHello> hello = std::make_shares<HelloProxy>(new Hello());
hello->Output("It is a test!");
return 0;
}
Result:
Before real Output
It is a test
After real Output
上面的例子是通過代理物件實現了方法攔截,這裡的Hello::Output就是核心邏輯,而HelloProxy是一個切面。
但是通過代理方法實現AOP還是有很多不足:不夠靈活,耦合性不強。
通過上面的例子相信大家對AOP已經有了解了。C++11提供了一個輕量級的AOP,基於動態植入,實現技術就是攔截目標方法。大家可以參考《C++深入應用》P255。
結合上面說的Ioc,相信做過java相關的開發人員一定很熟悉,是滴,這就是C++11怎麼實現一個類似的Spring框架。Spring框架的核心就是:AOP和Ioc。
以上是個人學習觀點,有錯誤的理解請大家糾正。