橋模式,其作用就是讓抽象與實現相分離,讓兩者都能夠各自變化。
舉例來說吧,畫圖,我可以畫矩形,圓,三角形等等,在哪裏畫呢?我可以在pdf上畫,也可以在doc上面畫。畫什麼圖和在哪裏畫都是可以獨立變化的,此種情況就比較適合用橋模式。就是說設計中有超過一維的變化我們就可以用橋模式。如果只有一維在變化,那麼我們用繼承就可以圓滿的解決問題。
我的圖形定義:
#pragma once
#include<vector>
#include"ImpShape.h"
class IShape
{
public:
IShape(void);
virtual ~IShape(void);
virtual std::vector<Point> getDrawPoints();
void paint();
public:
ImpShape *implementor;
};
其他圖形都繼承之:
#pragma once
#include "ishape.h"
class CRectangle :
public IShape
{
public:
CRectangle(void);
~CRectangle(void);
};
#pragma once
#include "ishape.h"
class CCircle :
public IShape
{
public:
CCircle(void);
~CCircle(void);
};
那麼在怎麼畫這個問題上,該怎麼實現呢?我先定義一個shape的實現類:
#pragma once
#include<vector>
class ImpShape
{
public:
ImpShape(void);
virtual ~ImpShape(void);
public:
virtual void draw(std::vector<Point>&);
};
那麼讓pdf和doc的實現類都繼承自ImpShape:
#pragma once
#include "impshape.h"
class ImpPdf :
public ImpShape
{
public:
ImpPdf(void);
~ImpPdf(void);
};
#pragma once
#include "impshape.h"
class ImpDoc :
public ImpShape
{
public:
ImpDoc(void);
~ImpDoc(void);
};
那ImpPdf和ImpDoc必須繼承且重寫ImpShape的draw函數。
我們的抽象和實現都分別實現好了,那兩者如何聯繫,如何使用的?
- 關於聯繫,細心的你也許已經發現,IShape裏面包含一個ImpShape的指針,包含!對。因爲ImpShape是實現IShape的,這裏用包含,我們可以在IShape的其他函數裏方便的調用。
#include "StdAfx.h" #include "IShape.h" IShape::IShape(void) { } IShape::~IShape(void) { } void IShape::paint() { std::vector<Point> vpoints = getDrawPoints(); this->implementor->draw(vpoints); }
- 關於使用,很簡單:
IShape *item = new CCircle();
item->implementor = new ImpPdf();
item->paint();
item = new CRectangle();
item->implementor = new ImpDoc();
item->paint();
這樣既滿足了畫什麼圖形的變化,也滿足了在什麼上畫的問題,他們之間的類圖如下:
LCL_data原創於CSDN.Net[http://blog.csdn.net/lcl_data/article/details/8710134]