天天看點

大話設計模式:橋接模式

一、什麼是橋接模式

将抽象部分和實作部分分隔開,使都可以獨立變化
           

關鍵在于分隔變化次元,将不同的次元分隔開,然後組合聚合,抽象與實作脫耦。

UML圖
           
大話設計模式:橋接模式

IMplementor:實作功能類之後會與抽象主題組合聚合

ConcreteMplementorA: 具體實作功能類A

Abstraction:抽象類,定義主體

二、适用場景

存在多元度描述對象的情況,可以使用橋接模式,比如 蠟筆可以分為大中小三個号,又分别有赤橙黃綠青藍紫七種顔色, 這就可以按 尺寸和顔色分兩個次元.一個類存在兩個獨立變化的次元,且這兩個次元都需要進行擴充;對于那些不希望使用繼承或因為多層次繼承導緻系統類的個數急劇增加的系統,橋接模式尤為适用。

三、優缺點

優點

抽象與實作分離,

便于擴充次元内容,極大減少子類

缺點

增加錫系統的了解和設計難度,聚合發生在抽象層,需要對抽象層進行程式設計設計。

需要正确識别出系統中兩個獨立變化的次元,使用具有局限性。

四、大話中的例子

手機品牌和軟體的例子,手機可以分為不同的品牌,手機軟體也可以分不同的軟體,使用橋接模式,便能友善的解決組合情況過多的情況。手機類抽象出來,華為手機、小米手機; 軟體抽象出來, 遊戲軟體,電腦軟體; 手機類持有軟體字段,可給字段附上内容。這個變化發生在用戶端。

五、我的例子

using System;
using System.Collections.Generic;


namespace BridgePatternMode
{
    class Program
    {
        static void Main(string[] args)
        {
            Ninjutsu ninjutsu = new LvSNinjutsu("風遁螺旋丸手裡劍", new WindAttribute());
            ninjutsu.Operation();
            ninjutsu = new LvANinjutsu("多重影分身");
            ninjutsu.Operation();
            ninjutsu = new LvSNinjutsu("魔鏡冰晶", new WindAttribute(), new WaterAttribute());
            ninjutsu.Operation();

            Console.ReadKey();
        }
    }

    abstract class Ninjutsu
    {
        protected string Lv;
        string name;
        List<NinjutsuAttribute> attributes;
        public Ninjutsu(string name, params NinjutsuAttribute[] attributes)
        {

            this.name = name;
            if (attributes != null)
            {
                this.attributes = new List<NinjutsuAttribute>();
                foreach (var item in attributes)
                {
                    this.attributes.Add(item);
                }
            }
        }
        public virtual void Operation()
        {
            foreach (var item in attributes)
            {
                item.MyAttribute();
            }
            Console.WriteLine("{0}級忍術,{1}", Lv, name);
        }
    }

    class LvDNinjutsu : Ninjutsu
    {

        public LvDNinjutsu(string name, params NinjutsuAttribute[] attributes) : base(name, attributes)
        {
            Lv = "D";
        }

    }

    class LvCNinjutsu : Ninjutsu
    {

        public LvCNinjutsu(string name, params NinjutsuAttribute[] attributes) : base(name, attributes)
        {
            Lv = "C";
        }

    }
    class LvBNinjutsu : Ninjutsu
    {

        public LvBNinjutsu(string name, params NinjutsuAttribute[] attributes) : base(name, attributes)
        {
            Lv = "B";
        }

    }
    class LvANinjutsu : Ninjutsu
    {

        public LvANinjutsu(string name, params NinjutsuAttribute[] attributes) : base(name, attributes)
        {
            Lv = "A";
        }

    }
    class LvSNinjutsu : Ninjutsu
    {

        public LvSNinjutsu(string name, params NinjutsuAttribute[] attributes) : base(name, attributes)
        {
            Lv = "S";
        }

    }

    abstract class NinjutsuAttribute
    {
        public abstract void MyAttribute();

    }
    class WaterAttribute : NinjutsuAttribute
    {
        public override void MyAttribute()
        {
            Console.Write("水屬性");
        }
    }
    class FireAttribute : NinjutsuAttribute
    {
        public override void MyAttribute()
        {
            Console.Write("火屬性");
        }
    }
    class WindAttribute : NinjutsuAttribute
    {
        public override void MyAttribute()
        {
            Console.Write("風屬性");
        }
    }

    class ThunderAttribute : NinjutsuAttribute
    {
        public override void MyAttribute()
        {
            Console.Write("雷屬性");
        }
    }
    class SoilAttribute : NinjutsuAttribute
    {
        public override void MyAttribute()
        {
            Console.Write("土屬性");
        }
    }
}

           
運作結果
           
大話設計模式:橋接模式

PS:橋接模式是雙次元的最佳展示,隻不過 執行個體的具體确認放在了用戶端.

繼續閱讀