動機:ThinkPad有多個型號,如T43,T60,每個型號都支援多種工作模式。每個型號在不同的模式下有些操作實現不同。隨著不斷髮展,其型號越來越多,工作模式也越來越多。如何把ThinkPad沿著型號和工作模式兩個方向的變化分離,使它們獨立變化,而不引入額外的複雜度(由基類不斷繼承以產生不同型號ThinkPad上不同工作模式所帶來的複雜性)?
應用:適應對象的多維度變化
結構
代碼實現
namespace DesignPattern.Bridge
{
public abstract class ThinkPad
{
// 通過不同型號ThinkPad對象組合在不同工作模式下實現相關操作的對象,把同一對象在不同模式下相關操作的變化轉移到該不同模式實現操作對象中,同時也為實現不同對象和不同模式的任意組合提供支援。
protected ThinkPadModeImp thinkPadModeImp;
public ThinkPad(ThinkPadModeImp thinkPadModeImp)
{
this.thinkPadModeImp = thinkPadModeImp;
}
public abstract void Start();
public abstract void Operate();
public abstract void ShutDown();
}
public class T43 : ThinkPad
{
public T43(ThinkPadModeImp thinkPadModeImp)
: base(thinkPadModeImp)
{
}
public override void Operate()
{
thinkPadModeImp.Operate1();
thinkPadModeImp.Operate2();
// Do something else
}
public override void Start()
{
}
public override void ShutDown()
{
}
}
public class T60 : ThinkPad
{
public T60(ThinkPadModeImp thinkPadModeImp)
: base(thinkPadModeImp)
{
}
public override void Operate()
{
thinkPadModeImp.Operate1();
thinkPadModeImp.Operate2();
// Do something else
}
public override void Start()
{
}
public override void ShutDown()
{
}
}
}
/**//*
* ThinkPad多模式下不同操作實現
*/
namespace DesignPattern.Bridge
{
public abstract class ThinkPadModeImp
{
public abstract void Operate1();
public abstract void Operate2();
}
public class ThinkPadMode1Imp : ThinkPadModeImp
{
public override void Operate1()
{
}
public override void Operate2()
{
}
}
public class ThinkPadMostMode2Imp : ThinkPadModeImp
{
public override void Operate1()
{
}
public override void Operate2()
{
}
}
}
namespace DesignPattern.Bridge
{
public class ThinkPadClient
{
public void Operate()
{
// 此處可根據需要應用建立型模式產生對象
ThinkPadMode1Imp thinkPadMode1Imp = new ThinkPadMode1Imp();
T60 t60 = new T60(thinkPadMode1Imp);
}
}
}
要點:
1、本模式使用“對象間的組合關係”解耦了抽象和實現之間固有的綁定關係,使得抽象(ThinkPad型號)和實現(工作模式)可以沿著各自的維度來變化。
2、所謂抽象和實現沿著各自的維度變化,即“子類化”它們(比如不同的ThinkPad子類,不同的工作模式子類)。得到各個子類之後,就可以任意組合ThinkPad型號和工作模式,從而得到不同型號、工作模式的ThinkPad。
3、本模式有時候類似於多整合方案,但是多繼承方案往往違背類單一職責原則(即一個類只有一個變化的原因),複用性比較差。Bridge模式更好。
4、本模式一般應用於對象面臨兩個非常強維度變化,有時候即使有兩個變更維度,但是某個方向的變化維度並不劇烈——兩個維度變化不會產生縱橫交錯的結果,並不一定要使用此模式。