為什么需要橋接模式?
對(duì)象的關(guān)系是在編譯時(shí)就定義好了,所以無法再運(yùn)行時(shí)改變從父類繼承的實(shí)現(xiàn)。子類的實(shí)現(xiàn)與它的父類有非常緊密的依賴關(guān)系,以至于父類實(shí)現(xiàn)中的任何變化必然會(huì)導(dǎo)致子類發(fā)生變化,當(dāng)你需要復(fù)用子類時(shí),如果繼承下來的實(shí)現(xiàn)不適合解決新的問題,則父類必須重寫或被其他更適合的類替換。這種依賴關(guān)系限制了靈活性并最終限制了復(fù)用性。-
合成/聚合復(fù)用原則
盡量使用合成/聚合,盡量不要使用類繼承。- 聚合:聚合表示一種弱的“擁有”關(guān)系,體現(xiàn)的是 A 對(duì)象可以包含 B 對(duì)象,但B 對(duì)象不是 A 對(duì)象的一部分。
- 合成,強(qiáng)的‘擁有‘關(guān)系,體現(xiàn)了嚴(yán)格的部分和整體的關(guān)系,部分和整體的聲明周期是一樣。
-
舉例
- 問題:
手機(jī)品牌:手機(jī)品牌 A,手機(jī)品牌 B。
手機(jī)軟件:游戲 ,通訊錄。
現(xiàn)在想要在兩個(gè)手機(jī)上分別安裝游戲和通訊錄。 -
分析:手機(jī)品牌作為抽象類 A,軟件做為抽象類 B,手機(jī)品牌和手機(jī)軟件之間屬于聚合關(guān)系,手機(jī)品牌包含手機(jī)軟件,但是手機(jī)軟件并不屬于手機(jī)品牌。
橋接.png
- 問題:
-
橋接模式
橋接模式,將抽象部分與它的實(shí)現(xiàn)部分分離,使它們都可以獨(dú)立的變化。
抽象與實(shí)現(xiàn)分離是指抽象類和它的派生類用來實(shí)現(xiàn)自己的對(duì)象。讓手機(jī)既可以按照品牌來分類也可以按照功能來分分類。
屏幕快照 2016-08-28 下午1.57.08.png 代碼實(shí)現(xiàn)
abstract class Implementor
{
public abstract void Operation();
}
class ConcreteImplentorA:Implementor
{
public override void Operation()
{
Console.WriteLine("A 方法執(zhí)行");
}
}
class ConcreteImplentorB:Implementor
{
public override void Operation()
{
Console.WriteLine("B 方法執(zhí)行");
}
}
class Abstraction
{
protected Implementor implementor;
public void SetImplementor(Implementor implementor)
{
this.implementor = implementor;
}
public virtual void Operation()
{
implementor.Operation();
}
}
class RefinedAbstraction:Abstraction
{
public override void Operation()
{
implementor.Operation();
}
}
//客戶端實(shí)現(xiàn)
static void Main(string[] args){
Abstraction ab = new Abstraction();
ab.Operation();
ab.SetImplementor(new ConcreteImplentorA);
ab.Operation();
ab.SetImplementor(new ConcreteImplentorB);
ab.Operation();
}

