1. 程式人生 > >C++11之AOP實現

C++11之AOP實現

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。

以上是個人學習觀點,有錯誤的理解請大家糾正。