C# 設計模式-橋接模式
阿新 • • 發佈:2021-01-20
一.介紹
橋接模式(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.增加了系統的複雜程度。