設計模式學習筆記五:建造者模式\裝飾模式\模板方法模式\原型模式\中介者模式\代理模式\外觀模式\適配器模式

一.建造者模式算法

  1.概念:ide

    建造者模式(Builder),是將一個複雜對象的構建與它的表示分離,使一樣的構建過程能夠建立不一樣的表示.函數

  2.實現類圖:ui

  3.代碼示例(C#)this

using System;
using System.Collections.Generic;
using System.Text;

namespace DesignPatternsCore
{
    /// <summary>
    /// 指揮者,進行對象構建
    /// </summary>
    public class Director
    {
        /// <summary>
        /// 具體的構建方法
        /// </summary>
        public void Construct(IBuilder builder)
        {
            builder.BuildPart1();
            builder.BuildPart2();
            builder.BuildPart3();
            builder.BuildPart4();

        }
    }
    /// <summary>
    /// 建造者接口
    /// </summary>
    public interface IBuilder
    {
        void BuildPart1();
        void BuildPart2();
        void BuildPart3();
        void BuildPart4();

    }
    /// <summary>
    /// 具體建造者
    /// </summary>
    public class ConcreteBuilder : IBuilder
    {
        public void BuildPart1()
        {
            Console.WriteLine("build part 1");
        }

        public void BuildPart2()
        {
            Console.WriteLine("build part 2");
        }

        public void BuildPart3()
        {
            Console.WriteLine("build part 3");
        }

        public void BuildPart4()
        {
            Console.WriteLine("build part 4");
        }
    }
}

  4.總結:建造者模式適用於那些建造過程比較固定可是建造過程又比較繁瑣的對象構造,這樣在常見新類型的對象模板時,就只須要集成對象的接口,實現其中具體的建造細節接口,在使用時指定建造類.可是若是建造過程常常改變,那麼就須要修改全部的建造子類或者修改建造接口,違反了開閉原則.spa

二.裝飾模式.net

  1.概念設計

    裝飾模式(Decorator),指動態地給一個對象添加一些額外的職責,就增長功能來講,裝飾模式比生成子類更爲靈活.代理

    在裝飾模式中,裝飾類會持有被裝飾類的對象(通常在裝飾類的構造方法中傳入這個對象),對於被裝飾類原本就有的功能,調用被裝飾類對象的相應功能進行完成,除此之外,再開放一些新的拓展功能接口.code

  2.示例類圖

 

 

  3.示例代碼

using System;
using System.Collections.Generic;
using System.Text;

namespace DesignPatternsCore
{
    public interface IComponent
    {
        void DoSomething();
    }
    /// <summary>
    /// 裝飾者
    /// 和被裝飾者繼承一樣的接口,保證有相同的方法
    /// 能夠繼承這個裝飾者建立裝飾者子類拓展更多屬性和方法
    /// </summary>
    public class Decorator : IComponent
    {
        //持有被裝飾者的對象
        private ConcreteComponent component;
        //構造方法中傳入被裝飾者
        public Decorator(ConcreteComponent component)
        {
            this.component = component;
        }
        //被裝飾者有的方法直接調用
        public void DoSomething()
        {
            component.DoSomething();
        }
        //拓展的方法
        public void DoMorething()
        {
            Console.WriteLine("do morething");
        }
    }
    /// <summary>
    /// 被裝飾者
    /// </summary>
    public class ConcreteComponent : IComponent
    {
        public void DoSomething()
        {
            Console.WriteLine("do something");
        }
    }
}

  4.總結:裝飾者模式能夠在不改動原有類的屬性和功能的基礎上爲這個類拓展功能,甚至能夠用裝飾者的不一樣子類構造出不一樣的功能拓展模板.在設計的時候,可使用裝飾的方式將一個模塊的核心功能和附加功能區分開,這樣能夠避免不當心更改了核心功能的狀況出現.

三.模板方法模式

  1.概念:

    模板方法模式(Template Method),其定義了一個操做中的算法的骨架,而將一些步驟延遲到子類中.模板方法使得子類能夠不改變一個算法的結構便可重定義該算法的某些特定步驟.

    能夠理解爲,模板方法模式定義了一系列的步驟,而這些步驟的實現交給子類去本身實現.如Unity中MonoBehaviour腳本的生命週期函數就能夠視爲使用了模板方法模式(雖然其基於反射實現,可是原理相同).

  2.示例類圖:

  3.示例代碼:

using System;
using System.Collections.Generic;
using System.Text;

namespace DesignPatternsCore
{
    /// <summary>
    /// 模板方法
    /// </summary>
    public abstract class TemplateMethod
    {
        //構造函數中定義函數調用步驟
        public TemplateMethod()
        {
            OnInit();
            OnStart();
            OnShow();
        }
        //各類初始化函數
        protected abstract void OnInit();
        protected abstract void OnShow();
        protected abstract void OnStart();
    }
    /// <summary>
    /// 子類繼承父類
    /// </summary>
    public class ConcreteClass : TemplateMethod
    {
        protected override void OnInit()
        {
            Console.WriteLine("on init");
        }

        protected override void OnShow()
        {
            Console.WriteLine("on show");
        }

        protected override void OnStart()
        {
            Console.WriteLine("on start");
        }
    }
}

四.原型模式

  1.概念:

    原型模式(Prototype):就是用原型示例指定建立對象的種類,而且經過拷貝這些原型建立新的對象.

    原型模式和模板方法模式有很大區別.模板方法模式重在方法的模板,預先設計好方法的調用次序,實現細節交給子類完成;原型模式重在整個對象的原型(包含屬性和方法),經過拷貝(深拷貝或淺拷貝)的方式建立新對象,再修改新對象和原對象的不一樣點,所以原型模式也叫作克隆(Clone)模式.

  2.實現:

    在.net的System命名空間中提供了ICloneable接口,實現原型模式只須要繼承這個接口,並實現Clone()方法便可.以下圖所示:

 

     MemberwiseClone方法是object對象提供的淺拷貝方法,若是須要深拷貝,還要本身實現.

 五.中介者模式

  1.概念:

    中介者模式(Mediator),指用一箇中介對象來封裝一系列的對象交互.中介者使各對象不須要顯式地相互引用,從而使其耦合鬆散,並且能夠獨立地改變他們之間的交互.

    中介者模式是一個心狀結構,中介者是核心,負責協調各對象之間的交互.中介者的優勢在於協調個對象之間的交互,可是同時缺點也同樣,中介者模式每每因爲協調的對象交互過多,致使中介者過於複雜,維護困難.

  2.實現類圖:

  3.實現代碼:

using System;
using System.Collections.Generic;
using System.Text;

namespace DesignPatternsCore
{
    /// <summary>
    /// 中介者
    /// </summary>
    public class Mediator
    {
        //須要瞭解全部的同事對象
        private List<Colleague> colleagueList;

        public Mediator()
        {
            colleagueList = new List<Colleague>();
        }

        public void AddColleague(Colleague colleague)
        {
            colleagueList.Add(colleague);
        }

        public void SendGift(Colleague colleague)
        {
            for(int i = 0;i < colleagueList.Count; i++)
            {
                if(colleague != colleagueList[i])
                {
                    colleagueList[i].ReceiveGift(colleague.Name);
                }
            }
        }
    }
    /// <summary>
    /// 全部同事類的父類
    /// </summary>
    public class Colleague
    {
        //全部同事都必須瞭解中介者
        protected Mediator mediator;
        public string Name { get; protected set; }

        public Colleague(string name,Mediator mediator)
        {
            Name = name;
            this.mediator = mediator;
        }
        public virtual void SendGift()
        {
            mediator.SendGift(this);
        }
        public virtual void ReceiveGift(string senderName)
        {
            Console.WriteLine(Name + " have received gift from " + senderName);
        }
    }
    /// <summary>
    /// 同事A
    /// </summary>
    public class ColleagueA : Colleague
    {
        public ColleagueA(Mediator mediator) : base("ColleagueA",mediator)
        {
            mediator.AddColleague(this);
        }

    }
    /// <summary>
    /// 同事B
    /// </summary>
    public class ColleagueB : Colleague
    {
        public ColleagueB(Mediator mediator) : base("ColleagueB", mediator)
        {
            mediator.AddColleague(this);
        }

    }
    /// <summary>
    /// 同事C
    /// </summary>
    public class ColleagueC : Colleague
    {
        public ColleagueC(Mediator mediator) : base("ColleagueC", mediator)
        {
            mediator.AddColleague(this);
        }

    }
}

六.代理模式:

  1.概念:

    代理模式(Proxy),爲其餘對象提供一種代理以控制對這個對象的訪問.

  2.應用:

    代理模式不少時候和裝飾者模式是混用的,二者的實現幾乎相同,代理模式也會持有被代理對象的引用,而且和被代理對象繼承自一樣的接口或類.實際調用時直接調用被代理對象的功能.可是兩種模式的側重點不一樣,代理模式側重於代理對象,即調用對象已有的功能,而裝飾者模式側重於拓展對象,即爲對象添加新的功能.可是使用過程當中能夠沒必要區分得那麼詳細,符合實際需求便可.

    代理模式和中介者模式就有比較大的區別了.中介者模式是管理多個對象之間的相互調用,在中介者模式中中介者是核心;代理模式每每只代理單個對象的對外交互功能,在代理模式中被代理對象是核心.

七.外觀模式

  1.概念:

    外觀模式(Facade),指爲子系統中的一組接口提供一個一致的界面,此模式定義了一個高層接口,這個接口使得這一子系統更加容易使用.

  2.應用:

    對於外觀模式,一樣沒有作實現,由於其和代理模式\中介模式一樣很是類似.代理模式通常代理一個對象的對外交互,而外觀模式通常代理多個對象的對外交互.外觀模式的Facade類和中介者模式的Mediator類在實際應用中又常常整合到一個類中,由於這二者都是處理多個對象的相互交互或對外交互的問題,這兩種職能在實際應用中每每難以區分,如使用中介者模式和外觀模式的對象是一些玩家眷性對象,提供一個獲取單個對象總屬性值的接口,這個接口就既能夠是對外交互的接口,也能夠是多個屬性對象之間交互的接口.

八.適配器模式

  1.概念:

    適配器模式(Adaptor),指將一個類的接口轉換成客戶但願的另一個接口.Adapter模式使得本來因爲接口不兼容而不能一塊兒工做的哪些類能夠一塊兒工做.

  2.應用:

    適配器模式很好理解,生活中常見適配器,如負責將220v的交流電轉化爲手機充電使用的直流電的電源適配器.在工程中也常常有使用適配器的地方,如Unity中熱更代碼和基礎工程代碼的相互調用就能夠提供適配器進行轉換.

相關文章
相關標籤/搜索