Unity---游戏设计模式(13)之命令模式
时间:2019-10-22
本文章向大家介绍Unity---游戏设计模式(13)之命令模式,主要包括Unity---游戏设计模式(13)之命令模式使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
概述参考请看 参考博客
将一个请求封装为一个Command对象,从而使你可用不同的请求对客户进行参数化; 对请求排队或记录请求日志,以及支持可撤销的操作。
比如RTS游戏中的基地升级功能。升级是需要时间的,当我们增加好几次升级时,它就会先等待第一次升级完成后才会执行后面的升级。
如果我们此时想要减少升级次数也可以。
我们就可以把每个升级之类的操作当作一个Command请求,每个请求需要排队执行,我们也可以撤销请求。
1、命令模式原型
命令模式原型UML图
命令模式原型代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 命令模式
/// </summary>
public class CommandMode : MonoBehaviour
{
private void Start()
{
CommandInvoker invoker = new CommandInvoker();
ConcreteCommand1 cmd1 = new ConcreteCommand1(new Receiver1());
ConcreteCommand1 cmd2 = new ConcreteCommand1(new Receiver1());
invoker.AddCommand(cmd1);
invoker.AddCommand(cmd2);
invoker.ExecuteCommand();
}
}
/// <summary>
/// 命令管理类
/// 根据invoker执行Command命令
/// </summary>
public class CommandInvoker
{
//命令集合
private List<ICommand> mCommands = new List<ICommand>();
public void AddCommand(ICommand command)
{
mCommands.Add(command);
}
/// <summary>
/// 使用params参数一次添加多个命令
/// </summary>
public void AddCommand(params ICommand[] commands)
{
foreach (ICommand command in commands)
{
mCommands.Add(command);
}
}
/// <summary>
/// 执行所有命令,执行完并清除
/// </summary>
public void ExecuteCommand()
{
foreach (ICommand command in mCommands)
{
command.Execute();
}
mCommands.Clear();
}
}
/// <summary>
/// 抽象命令类
/// </summary>
public abstract class ICommand
{
public abstract void Execute();
}
public class ConcreteCommand1 : ICommand
{
//每个命令类中有一个接收者,接收者对象绑定一个具体的动作
private Receiver1 mReceiver1;
public ConcreteCommand1(Receiver1 receiver1)
{
mReceiver1 = receiver1;
}
//通过调用接收者来执行具体的命令
public override void Execute()
{
mReceiver1.Action("ConcreteCommand1");
}
}
/// <summary>
/// 接收者类,绑定一个具体的执行操作,任何类都可能作为一个接收者
/// </summary>
public class Receiver1
{
public void Action(string cmd)
{
Debug.Log("Receiver1执行了命令:" + cmd);
}
}
2、命令模式优缺点
优点
- 降低了请求者和实现者之间的耦合度。
- 对请求排队或记录请求日志,支持撤销操作。
- 可以容易地设计一个组合命令。
- 新命令可以容易地加入到系统中。
缺点
- 类个数较多
原文地址:https://www.cnblogs.com/Fflyqaq/p/11722396.html
- 自然语言处理 语言模型介绍
- 口水先擦干!从大数据看外卖如何拯救“忙”与“宅”
- javascript:巧用eval函数组装表单输入项为json对象
- Django——model基础
- java学习:日期的运算
- ORACLE:写Function时,传入参数变量名的注意事项
- spring boot 登录注册 demo (二) -- 数据库访问
- spring boot 登录注册 demo (三) -- 前后端传递
- python装饰器大详解
- spring boot 登录注册 demo (四) -- 体验小结
- jenkins 时区设置
- 什么样的密码才是安全的?
- MAC本遭遇ARP攻击的处理办法
- nodejs 语法学习(持续更新)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- php 自定义函数实现将数据 以excel 表格形式导出示例
- 解决tp5在nginx下修改配置访问的问题
- 在PHP中实现使用Guzzle执行POST和GET请求
- c 语言函数指针之回调函数
- 解决thinkphp5未定义变量会抛出异常,页面错误,请稍后再试的问题
- php和js实现根据子网掩码和ip计算子网功能示例
- php ZipArchive实现多文件打包下载实例
- PHP 代码简洁之道(小结)
- Thinkphp 在api开发中异常返回依然是html的解决方式
- Laravel 连接(Join)示例
- 解决Laravel自定义类引入和命名空间的问题
- 详解Laravel服务容器的绑定与解析
- 修改Laravel自带的认证系统的User类的命名空间的步骤
- PHP使用递归按层级查找数据的方法
- Laravel6.2中用于用户登录的新密码确认流程详解