设计模式---命令模式(DesignPattern_Command)

DesignPattern_Command

摘录自:设计模式与游戏完美开发

十年磨一剑,作者将设计模式理论巧妙地融入到实践中,以一个游戏的完整实现呈现设计模式的应用及经验的传承 《轩辕剑》之父——蔡明宏、资深游戏制作人——李佳泽、Product Evangelist at Unity Technologies——Kelvin Lo、信仁软件设计创办人—— 赖信仁、资深3D游戏美术——刘明恺 联合推荐全书采用了整合式的项目教学,即以一个游戏的范例来应用23种设计模式的实现贯穿全书,让读者学习到整个游戏开发的全过程和作者想要传承的经验,并以浅显易懂的比喻来解析难以理解的设计模式,让想深入了解此领域的读者更加容易上手。

工程GitHub

COMMAND—俺有一个MM家里管得特别严,没法见面,只好借助于她弟弟在我们俩之间传送信息,她对我有什么指示,就写一张纸条让她弟弟带给我。这不,她弟弟又传送过来一个COMMAND,为了感谢他,我请他吃了碗杂酱面,哪知道他说:“我同时给我姐姐三个男朋友送COMMAND,就数你最小气,才请我吃面。”,:-(

  • 命令模式:命令模式把一个请求或者操作封装到一个对象中。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。命令模式允许请求的一方和发送的一方独立开来,使得请求的一方不必知道接收请求的一方的接口,更不必知道请求是怎么被接收,以及操作是否执行,何时被执行以及是怎么被执行的。系统支持命令的撤消。

源码注释及命名有所更改,个人感觉会比原版更好理解

using UnityEngine;
using System.Collections.Generic;

namespace DesignPattern_Command
{
    // 执行命令基类
    public abstract class Command
    {
        public abstract void Execute();
    }

    // 将命令与Receiver1结合
    public class ConcreteCommand1 : Command
    {
        Receiver1 m_Receiver = null;
        string m_Command = "";

        public ConcreteCommand1(Receiver1 Receiver, string Command)
        {
            m_Receiver = Receiver;
            m_Command = Command;
        }

        public override void Execute()
        {
            m_Receiver.Action(m_Command);
        }
    }

    // 将命令与Receiver2结合
    public class ConcreteCommand2 : Command
    {
        Receiver2 m_Receiver = null;
        int m_Param = 0;

        public ConcreteCommand2(Receiver2 Receiver, int Param)
        {
            m_Receiver = Receiver;
            m_Param = Param;
        }

        public override void Execute()
        {
            m_Receiver.Action(m_Param);
        }
    }

    // 负责执行命令1
    public class Receiver1
    {
        public Receiver1() { }
        public void Action(string Command)
        {
            Debug.Log("Receiver1.Action:Command[" + Command + "]");
        }
    }

    // 负责执行命令1
    public class Receiver2
    {
        public Receiver2() { }
        public void Action(int Param)
        {
            Debug.Log("Receiver2.Action:Param[" + Param.ToString() + "]");
        }
    }


    // 命令管理者
    public class Invoker
    {
        List<Command> m_Commands = new List<Command>();

        // 加入命令
        public void AddCommand(Command theCommand)
        {
            m_Commands.Add(theCommand);
        }

        // 执行命令
        public void ExecuteCommand()
        {
            // 执行
            foreach (Command theCommand in m_Commands)
                theCommand.Execute();
            // 清空 
            m_Commands.Clear();
        }
    }
}

using UnityEngine;
using System.Collections;
using DesignPattern_Command;

public class CommandTest : MonoBehaviour
{
    void Start()
    {
        UnitTest();
    }

    // 
    void UnitTest()
    {
        Invoker theInvoker = new Invoker();

        Command theCommand = null;
        // 将命令与执行结合
        theCommand = new ConcreteCommand1(new Receiver1(), "你好");
        theInvoker.AddCommand(theCommand);
        theCommand = new ConcreteCommand2(new Receiver2(), 999);
        theInvoker.AddCommand(theCommand);

        // 執行
        theInvoker.ExecuteCommand();

    }
}

上一篇:设计模式---模板模式(DesignPattern_TemplateMethod)


下一篇:jQuery 特效_自定义2|学习笔记