設計模式之橋接模式

fomalhaut_sh發表於2021-04-13

前言

這裡又學習一個新的原則,合成/聚合複用原則~。下面一起來看~

橋接模式

抽象部分與它的實現部分分離,使它們都可以獨立的變化。這也是和合成/聚合分不開的。
也就是實現系統可能有多角度分類,每一種分類都有可能變化,那麼就是把這種多角度分離出來讓它們獨立變化,減少耦合。這也符合了開放-封閉原則

幽默一下:
兩個抽象類之間有一條聚合線,像一座橋一樣,所以名為橋接模式~

場景

比如我們的手機。手機裡有很多軟體,不同的手機軟體不同,但是往往也有相同的軟體,如果我們將每一種軟體獨立開,那麼不同的手機只要拿自己需要的軟體部分就可以了。我們需要增加功能的話也不用修改原來的程式碼,擴充套件類就可以。運用合成/聚合原則,優先使用物件的合成或聚合,而不是類繼承。

應用

我們需要多角度去分類實現物件,而只用繼承會造成大量的類增加,不能滿足開放-封閉原則時,就應該考慮橋接模式。

程式碼展示

拿手機品牌與軟體舉例子:

手機軟體抽象類:

abstract class HandsetSoft
    {
        public abstract void Run();
    }

手機軟體具體類:

如果這裡我想要新增一些其他軟體,比如說MP3功能,那麼只需要增加這個功能類就可以了,不會影響其他軟體類

//具體類

    //手遊
    class HandsetGame:HandsetSoft 
    {
        public override void Run()
        {
            Console.WriteLine("執行手遊");
        }
    }

    //通訊錄---程式碼同上↑
    class HandsetAddressList : HandsetSoft
    {
        public override void Run()
        {
            Console.WriteLine("執行手機通訊錄");
        }
    }

手機品牌類:

//手機品牌類
    abstract class HandsetBrand
    {
        protected HandsetSoft soft;

        //設定手機軟體
        public void SetHandsetSoft(HandsetSoft soft)//品牌需要關注軟體,
        {
            this.soft = soft;
        }

        //執行
        public abstract void Run();
    }

手機品牌具體類:

如果我要增加一個S牌,只要增加一個品牌子類就可以了。不會影響別的類。

//具體手機品牌

    //N牌
    class HandsetBrandN:HandsetBrand 
    {
        public override void Run()
        {
            soft.Run();
        }
    }

    //M牌
    class HandsetBrandM : HandsetBrand
    {
        public override void Run()
        {
            soft.Run();
        }
    }

客戶端程式碼:

class Program
    {
        static void Main(string[] args)
        {
            HandsetBrand a;
//N
            a = new HandsetBrandN();
            a.SetHandsetSoft(new HandsetGame());
            a.Run();
            a.SetHandsetSoft(new HandsetAddressList());
            a.Run();
//M
            a = new HandsetBrandM();
            a.SetHandsetSoft(new HandsetGame());
            a.Run();
            a.SetHandsetSoft(new HandsetAddressList());
            a.Run();

            Console.Read();
        }
    }

效果圖:

橋接

合成/聚合複用原則

what

儘量使用合成/聚合,儘量不要使用類繼承。
合成和聚合都是關聯的特殊種類。
1. 聚合表示一種弱的‘擁有’關係,體現的時A可以包含B,但B不是A的一部分;
2. 合成則時一種強的‘擁有’關係,體現了嚴格的部分和整體的關係,部分和整體的生命週期一樣。

example

合成:大雁和翅膀,翅膀與大雁是部分與整體的關係,它們的生命週期一樣。
大雁

聚合:大雁和雁群,每隻大雁屬於一個雁群,但一個雁群可以有很多隻大雁。
雁群

好處

優先使用物件的合成/聚合有助於你保持每個類被封裝,並被集中在單個任務上。這樣類和類繼承層次會保持較小規模,並且不太可能增長為不可控制的龐然大物。

後記

只要真正深入理解了設計模式,很多設計模式其實就是原則的應用而已,或許在不知不覺中就在使用設計模式了~所以還是要以後多實踐呶~

相關文章