橋接模式(Bridge),將抽象部分與它的實現部分分離,使它們都可以獨立地變化。
橋接模式比喻
早上碰到MM,要說早上好,晚上碰到MM,要說晚上好;碰到MM穿了件新衣服,要說你的衣服好漂亮哦,碰到MM新做的髮型,要說你的頭髮好漂亮哦。不要問我“早上碰到MM怎麼說晚上好”這種問題,自己用經委BRIDGE組合一下不就行了。這就是橋接模式了!
橋接模式意圖
橋接模式(Bridge)將抽象部分與它的實現部分分離,使它們都可以獨立地變化。
橋接模式類圖
橋接模式實現
/// <summary>
/// 我要說的話的抽象
/// </summary>
abstract class Bloger
{
public abstract void Greet();
}/// <summary>
/// 我說:早上好!
/// </summary>
class MorningImp : Bloger
{
public override void Greet()
{
Console.WriteLine("早上好!");
}
}/// <summary>
/// 我說:晚上好
/// </summary>
class NightImp:Bloger
{
public override void Greet()
{
Console.WriteLine("晚上好!");
}
}/// <summary>
/// 我說:你的衣服好漂亮哦!
/// </summary>
class ClothesImp : Bloger
{
public override void Greet()
{
Console.WriteLine("你的衣服好漂亮哦!");
}
}/// <summary>
/// 我說:你的頭髮好漂亮哦!
/// </summary>
class HeadformImp : Bloger
{
public override void Greet()
{
Console.WriteLine("你的頭髮好漂亮哦!");
}
}/// <summary>
/// 遇到MM的時機
/// </summary>
class Opportunity
{
protected Bloger imp;
public void SetImp(Bloger imp)
{
this.imp = imp;
}public virtual void ShowGreet()
{
Console.Write("遇見女生的場合:");
imp.Greet();
}
}/// <summary>
/// 時機:早上
/// </summary>
class Morning : Opportunity
{
public override void ShowGreet()
{
Console.Write("早上碰到MM:");
imp.Greet();
}
}/// <summary>
/// 時機:晚上
/// </summary>
class Night : Opportunity
{
public override void ShowGreet()
{
Console.Write("晚上碰到MM:");
imp.Greet();
}
}/// <summary>
/// 時機:碰到MM穿了件新衣服
/// </summary>
class Clothes : Opportunity
{
public override void ShowGreet()
{
Console.Write("碰到MM穿了件新衣服:");
imp.Greet();
}
}/// <summary>
/// 時機:碰到MM新做的髮型
/// </summary>
class Headform : Opportunity
{
public override void ShowGreet()
{
Console.Write("碰到MM新做的髮型:");
imp.Greet();
}
}/// <summary>
/// 橋接模式客戶端應用
/// </summary>
class Program
{
static void Main(string[] args)
{
//時機:早上
Opportunity m = new Morning();
//我說:早上好!
m.SetImp(new MorningImp());
m.ShowGreet();//時機:晚上
Opportunity n = new Night();
//我說:晚上好!
n.SetImp(new NightImp());
n.ShowGreet();//時機:碰到MM穿了件新衣服
Opportunity c = new Clothes();
//我說:你的衣服好漂亮哦!
c.SetImp(new ClothesImp());
c.ShowGreet();//時機:碰到MM新做的髮型
Opportunity h = new Headform();
//我說:你的頭髮好漂亮哦!
h.SetImp(new HeadformImp());
h.ShowGreet();//時機:早上
Opportunity o=new Morning();
//由於緊張,早上碰到MM竟然說了句"晚上好!",丟人啊!
o.SetImp(new NightImp());
o.ShowGreet();Console.Read();
}
}
橋接模式總結
早上碰到MM,要說早上好的實現就是把早上遇到MM的時機和我要說的話組合起來就可以了。同樣的,早上遇到MM我也可以說晚上好,那就是把早上的時機和我要說的話:“晚上好”組合起來就可以了。橋接模式體現着放料閥合成/聚合複用原則,聚合表示一種弱的擁有關係,體現着AasB;合成則是一種強的擁有關係,體現着嚴格的部分和整體的關係,部分和整體的生命週期一樣,體現着AisB,儘量使用合成/聚合,儘量不要使用類繼承。