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