設計模式 - 裝飾者模式

  • 1705
  • 0
  • 2018-04-01

此篇簡單介紹裝飾者模式.

    應用情境: 
        有個需求介面, 底下有很多的實作. 此時需要為這些物件的某些方法進行加工, 這些加工並沒有統一性且無規則可言的同時(就是無法靠介面原有的定義來增加實作達到需求時), 此時就能透過裝飾者模式來完成需求.

    原理:
        透過繼承需求介面創建一個抽象類, 並使用實作類來完成. 且透過原介面所定義的方法來完成加工. 客戶端在使用邏輯上是一模一樣的(流程稍加不同), 執行同樣的方法卻產出不同的行為.


 

類別圖 : 

 

原服務 - 介面:

namespace 裝飾者模式
{
    public interface IComponet //裝備
    {
        void Operation();
    }
}

原服務 - 實作 :

namespace 裝飾者模式
{
    public  class Player1 : IComponet
    {
        public void Operation()
        {
            Console.WriteLine("玩家一");
        }
    }

    public class Player2 : IComponet
    {
        public void Operation()
        {
            Console.WriteLine("玩家二");
        }
    }
}

 

裝飾模組 - 抽象類 :

namespace 裝飾者模式
{
    /// <summary>
    /// 裝飾者抽象類, 主要目的為制定規則
    /// </summary>
    public abstract class DecoratorObject : IComponet
    {
        protected IComponet _componet;

        public DecoratorObject(IComponet player)
        {
            this._componet = player;
        }

        // 讓外部可設置玩家
        abstract public void SetPlayer(IComponet setPlayer);

        public abstract void Operation();
    }
    
    .....
}

裝飾模組 - 實作類 :

namespace 裝飾者模式
{
    .....

    public class Decorator1ForPlayer : DecoratorObject
    {

        public Decorator1ForPlayer(IComponet player) : base(player)
        {
        }

        public override void SetPlayer(IComponet setPlayer)
        {
            base._componet = setPlayer;
        }

        public override void Operation() // 使用同方法, 卻額外加工行為
        {
            Console.WriteLine("修飾裝備1: 手套+攻擊");
        }
    }

    public class Decorator2ForPlayer : DecoratorObject
    {

        public Decorator2ForPlayer(IComponet player) : base(player)
        {
        }

        public override void SetPlayer(IComponet setPlayer)
        {
            base._componet = setPlayer;
        }

        public override void Operation() // 使用同方法, 卻額外加工行為
        {
            Console.WriteLine("修飾裝備2: 行動速度+10");
        }
    }
}

 

用戶端 : 

namespace 裝飾者模式
{
    class Program
    {
        static void Main(string[] args)
        {
            // 情境: 每個玩家都有作業的方法, 但此時需要在此方法加工. 但加工的方法很沒有規則性

            // 創建玩家
            IComponet player1 = new Player1();
            IComponet player2 = new Player2();
            // 原目的
            player1.Operation();
            player2.Operation();

            // 玩家修飾各種裝備
            DecoratorObject decorator = new Decorator1ForPlayer(player1);
            DecoratorObject decorator2 = new Decorator2ForPlayer(player2);

            decorator.Operation(); // 玩家一 搜秀
            decorator2.Operation(); // 玩家二 搜秀

            Console.Read();
        }
    }
}

 

結果顯示 : 

 


多多指教!! 歡迎交流!!

你不知道自己不知道,那你會以為你知道