桥接模式(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,尽量使用合成/聚合,尽量不要使用类继承。