1. 程式人生 > 實用技巧 >C# 設計模式-橋接模式

C# 設計模式-橋接模式

一.介紹  

  橋接模式(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.增加了系統的複雜程度。