桥接模式(Bridge),将抽象部分与它的实现部分分离,使它们都可以独立地变化。
桥接模式比喻
早上碰到MM,要说早上好,晚上碰到MM,要说晚上好;碰到MM穿了件新衣服,要说你的衣服好漂亮哦,碰到MM新做的发型,要说你的头发好漂亮哦。不要问我“早上碰到MM怎么说晚上好”这种问题,自己用BRIDGE组合一下不就行了。这就是桥接模式了!桥接模式意图
桥接模式(Bridge)将抽象部分与它的实现部分分离,使它们都可以独立地变化。桥接模式类图
桥接模式实现
////// 我要说的话的抽象 /// 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,尽量使用合成/聚合,尽量不要使用类继承。