一.介绍
桥接模式(Bridge Pattern)。属于结构型模式。将抽象部分与它的实现部分分离,使得它们可以独立地变化。
二.实现
举个例子,魔术师的法杖可以用口令施展法术攻击,有火法杖和冰法杖,法杖可以施展射击。法杖可以定为Wand抽象类,火法杖和冰法杖来继承抽象,这样火法杖和冰法杖就能实现射击。如果再添加其它类型法杖,这样添加一个派生类就可以实现。
public abstract class Wand { public virtual void Shooting() { } } public class FireWand: Wand { public override void Shooting() { Console.WriteLine("用口令施展火射击"); } } public class IceWand : Wand { public override void Shooting() { Console.WriteLine("用口令施展冰射击"); } }
但如果有的魔术师喜欢用手势施展法术,那往抽象类添加一个手势施展法术的方法也可以处理,但如果法杖类型和法术类型同时修改的话,那这个设计就显得不太合适。魔术师一般只拿一根法杖,这个设计时一根法杖可以兼容口令施展和手势施展法术,但不兼容多类法术。用桥接模式就可以较好地解决这个问题。
//法杖 public abstract class Wand { private Magic magic; //存储法术 public void SetMagic(Magic mg) { this.magic = mg; } public virtual void Shooting() { magic.Shooting(); } } //法术 public interface Magic { //施展法术射击 void Shooting(); } //A法杖 public class AWand : Wand { public override void Shooting() { Console.WriteLine("用口令施展"); base.Shooting(); } } //B法杖 public class BWand : Wand { public override void Shooting() { Console.WriteLine("用手势施展"); base.Shooting(); } } //火法术 public class FireMagic : Magic { public void Shooting() { Console.WriteLine("火射击"); } } //冰法术 public class IceMagic : Magic { public void Shooting() { Console.WriteLine("冰射击"); } } //调用 public static void Main(string[] args) { //挑选法杖 a是口令 b是手势 Wand a = new AWand(); a.SetMagic(new FireMagic());//注入火法术 a.Shooting();//火射击 a.SetMagic(new IceMagic());//注入冰法术 a.Shooting();//冰射击 }
上面的桥接模式实现中,法杖的功能方法不在法杖抽象类中实现了,而是把实现部分放到了法术类中,法杖只是调用法术而已。这样的设计也较为合理,法杖本身就是用来施展存储在里面法术的工具。这样就能把抽象化和实现化的部分分离开来,能很好的应对两个方面的变化。
三.总结
优点:
1.把抽象接口与其实现解耦。
2.抽象和实现可以独立拓展,不会影响到对方。
缺点:
1.增加了系统的复杂程度。