結構型模式之橋接模式(Bridge)

1. 意圖
將抽象部分與它的實現部分分離,使它們都可以獨立地變化。
2. 動機

當一個抽象可能有多個實現時,通常用繼承來協調它們。抽象類定義對該抽象的接口,而具體的子類則用不同方式加以實現。但是此方法有時不夠靈活。繼承機制將抽象部分與它的實現部分固定在一起,使得難以對抽象部分和實現部分獨立地進行修改、擴充和重用。


3. 舉例

就拿汽車在路上行駛的來說。即有小汽車又有公共汽車,它們都不但能在市區中的公路上行駛,也能在高速公路上行駛。這你會發現,對於交通工具(汽車)有不同的類型,然而它們所行駛的環境(路)也在變化,在軟件系統中就要適應兩個方面的變化?怎樣實現才能應對這種變化呢?

傳統做法:


橋接模式:



C++代碼:

#ifndef BRIDGE_H
#define BRIDGE_H
#include <iostream>
using std::cout;
using std::endl;
class CVehicle{
public:
	virtual void Run()=0;
};
class CCar : public CVehicle{
public:
	virtual void Run(){
		cout<<"The car is running ";
	}
};
class CBus : public CVehicle{
public:
	virtual void Run(){
		cout<<"The bus is running ";
	}
};
class CRoad{
private:
	CVehicle* m_Vehicle;
public:
	CRoad(CVehicle* temp){
		m_Vehicle=temp;
	}
	virtual void Drive(){m_Vehicle->Run();}
	virtual void Place()=0;
};
class CHighSpeed : public CRoad{
public:
	CHighSpeed(CVehicle* temp) : CRoad(temp){}
	virtual void Place(){
		cout<<"on the highspeed!"<<endl;
	}
};
class CStreet : public CRoad{
public:
	CStreet(CVehicle* temp) : CRoad(temp){}
	virtual void Place(){
		cout<<"on the street!"<<endl;
	}
};
#endif

#include <iostream>
#include "bridge.h"
int main(){
	CRoad* pRoad=new CHighSpeed(new CCar);
	pRoad->Drive();
	pRoad->Place();
	CRoad* pWay=new CStreet(new CBus);
	pWay->Drive();
	pWay->Place();
}


發佈了73 篇原創文章 · 獲贊 98 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章