此篇簡單介紹裝飾者模式.
應用情境:
有個需求介面, 底下有很多的實作. 此時需要為這些物件的某些方法進行加工, 這些加工並沒有統一性且無規則可言的同時(就是無法靠介面原有的定義來增加實作達到需求時), 此時就能透過裝飾者模式來完成需求.
原理:
透過繼承需求介面創建一個抽象類, 並使用實作類來完成. 且透過原介面所定義的方法來完成加工. 客戶端在使用邏輯上是一模一樣的(流程稍加不同), 執行同樣的方法卻產出不同的行為.
類別圖 :
原服務 - 介面:
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();
}
}
}
結果顯示 :
多多指教!! 歡迎交流!!
你不知道自己不知道,那你會以為你知道