1. 程式人生 > >設計模式(五) 橋接模式

設計模式(五) 橋接模式

這個部落格寫的很好,定義和例子都說的很形像,直接引用。

https://blog.csdn.net/xingjiarong/article/details/50132727

例子:大中小3種型號的畫筆,能夠繪製5種不同顏色,如果使用蠟筆,我們需要準備3*5=15支蠟筆,也就是說必須準備15個具體的蠟筆類。而如果使用毛筆的話,只需要3種型號的毛筆,外加5個顏料盒,用3+5=8個類就可以實現15支蠟筆的功能。實際上,蠟筆和毛筆的關鍵一個區別就在於筆和顏色是否能夠分離
 

定義:橋接(Bridge)是用於把抽象化與實現化解耦,使得二者可以獨立變化。

如果抽象和實現兩者做不到獨立地變化,就不算橋接模式

http://www.runoob.com/design-pattern/bridge-pattern.html

優點: 1、抽象和實現的分離。 2、優秀的擴充套件能力。 3、實現細節對客戶透明。

缺點:橋接模式的引入會增加系統的理解與設計難度,由於聚合關聯關係建立在抽象層,要求開發者針對抽象進行設計與程式設計。

使用場景: 

1、如果一個系統需要在構件的抽象化角色和具體化角色之間增加更多的靈活性,避免在兩個層次之間建立靜態的繼承聯絡,通過橋接模式可以使它們在抽象層建立一個關聯關係。

2、對於那些不希望使用繼承或因為多層次繼承導致系統類的個數急劇增加的系統,橋接模式尤為適用。

3、一個類存在兩個獨立變化的維度,且這兩個維度都需要進行擴充套件。

注意事項:對於兩個獨立變化的維度,使用橋接模式再適合不過了。

 

橋接屬於聚合關係,兩者關聯 但不繼承
介面卡屬於組合關係,適配者需要繼承源

聚合關係:A物件可以包含B物件 但B物件不是A物件的一部分。例如,狼群和狼。

橋樑模式的結構

示例

 

abstract class brushPen{
	public $color;
	public function setColor(implementorColor $color){
		$this->color = $color;
	}
	abstract public function draw();
}
abstract class implementorColor{
	abstract public function bepaint();
}

class bigPen extends brushPen{
	public function draw(){
		echo $this->color->bepaint() . " big\n";
	}
}
class smallPen extends brushPen{
	public function draw(){
		echo $this->color->bepaint() . " small\n";
	}
}
class middlePen extends brushPen{
	public function draw(){
		echo $this->color->bepaint() . " middle\n";
	}
}

class blue extends implementorColor{
	public function bepaint(){
		echo 'blue';
	}
}
class red extends implementorColor{
	public function bepaint(){
		echo 'red';
	}
}
class green extends implementorColor{
	public function bepaint(){
		echo 'green';
	}
}

$color = new blue();
$pen = new smallPen();
$pen->setColor($color);
$pen->draw();