設計模式(五)橋接模式Bridge == Pointer To Implementation

CalmReason發表於2016-03-16

意圖:將抽象部分與實現部分分離,使它們都可以獨立的變化。(核心在抽象,為了應對變更才有了不同的實現)
示例程式碼:
介面類sample
sample.h

#pragma once
#include "boost/smart_ptr.hpp"
using namespace boost;

class imp;//只需要宣告無需包含原始檔
class sample
{
public:
	sample(void);
	~sample(void);
	void print(void) const;
private:
	//當sample析構的時候會先呼叫成員變數的析構
	//pimp_的析構會引發引用計數為0,從而呼叫imp物件的析構
	boost::shared_ptr<imp> pimp_;
};
sample.cpp

#include "sample.h"
//必須包含定義
#include "imp.h"
#include<iostream>
using namespace std;

sample::sample(void):pimp_(new imp)//建構函式完成初始化,shared_ptr接受new返回的指標
{
	cout<<"sample()"<<endl ;
}

sample::~sample(void)
{
	cout<<"~sample()"<<endl ;
}

void sample::print(void) const
{
	this->pimp_->imp_print();//橋接:將業務類與實現類隔離開來
}
實現類imp
imp.h

#pragma once
//沒必要繼承sample
class imp
{
public:
	imp(void);
	~imp(void);
	void imp_print(void) const;
};
imp.cpp

#include "imp.h"
#include<iostream>
using namespace std;
//這裡修改之後的編譯不會影響sample,以及main的重新編譯
imp::imp(void)
{
	cout<<"imp()"<<endl ;
}

imp::~imp(void)
{
	cout<<"~imp()"<<endl;
}

void imp::imp_print(void) const
{
	cout<<"imp::pint()"<<endl;
}
bridge_main.cpp

#include "sample.h"

int main(int,char**)
{
	sample s;
	s.print();

	return 0;
};


相關文章