设计模式学习-简单的命令模式例子

news2024/9/20 8:52:40

上一章节介绍过了命令模式,这一篇文章就简单的做一个小案例来巩固学习

搭建场景

简单的搭建一个场景就行 ,随便准备一个物体放在场景中位置Reset一下即可。
在这里插入图片描述

代码编写
  1. 定义接口(或者抽象类)ICommand 用来规范Command的行为。注意在命令模式中命令是桥接作用负责接受者和执行者之间的联调。所以一般会有很多的命令,每个命令都会有ICommand规范的方法同时也可以添加其他的方法。
public interface ICommand{
	void Execute();
	void UnExecute();
}
  1. 实现定义的接口(或者抽象类) 同时为了具有这种桥接的作用,MyCommand 需要持有Receiver
public enum Direction{
	Left,
	Down,
	Right,
	Up
}
public class MyCommand : ICommand{
	private Receiver _receiver;
	private Direction _direction;
	private GameObject _moveObj;
	private float _distance;
	
	public MyCommand(Direction direction,Receiver receiver,GameObject moveObj,float distance){
		this._receiver = receiver;
		this._direction = direction;
		this._moveObj = moveObj;
		this._distance = distance;
	}
	public void Execute(){
		_receiver.OperationDirection(_moveObj,_direction,_distance );
	}
	public void UnExecute(){
		_receiver.OperationDirection(_moveObj,InverseDirection(_direction),_distance );
	}
	private Direction InverseDirection(Direction direction){
		switch(direction){
		case Direction.Left:
			return Direction.Right;
		case Direction.Right:
			return Direction.Left;
		case Direction.Up:
			return Direction.Down;
		case Direction.Down:
			return Direction.Up;
		}
	}

	public override void ToString(){
		return $"{_moveObj.name}:{DirectionStr(_direction)}:{_distance.ToString()}";
	}
	private string DirectionStr(Direction dircteion) {
    switch (dircteion) 
    { 
        case Direction.Left:
            return "Left";
        case Direction.Right:
            return "Right";
        case Direction.Up:
            return "Up";
        case Direction.Down:
            return "Down";
        default:
            return default;
    }
}
}

3.接受者,接受者的意思是接受命令执行自身的函数

public class Receiver{
	public void OperationDirection(GameObject moveObj,Direction direction,float distance){
		switch(direction){
		case Direction.Left:
			MoveX(moveObj,-distance);
			break;
		case Direction.Right:
			MoveX(moveObj,distance);
			break;
		case Direction.Up:
			MoveY(moveObj,distance);
			break;
		case Direction.Up:
			MoveY(moveObj,-distance);
			break;
		}
	}
	
	private void MoveX(GameObject moveObj,float distance){
		var tempPos = moveObj.transform.position;
		tempPos .x+=distance;
		moveObj.transform.position = tempPos;
	}
	private void MoveY(GameObject moveObj,float distance){
		var tempPos = moveObj.transform.position;
		tempPos.y+=distance;
		moveObj.transform.position = tempPos;
	}
}

4.执行者,挂载在场景中的任意物体上(建议放空物体上)负责代码的执行 调度

public class InputHandler : MonoBehaviour{
	private Receiver _receiver;
	[SerializeField]
    [Tooltip("移动距离")]
	private float distance = 1f;
	private List<ICommand> commands = new List<ICommand>(); // 存储命令方便回溯
 	private int currentCommandNum = 0;  // 当前执行的命令
 	public GameObject moveObj;  //控制的物体上面的那个Move直接拖到这里进行绑定 
	
	private void Start()
	{
    	_receiver= new Receiver();
		// 空处理 可写可不写
	}
	private void Move(Direction direction){
		var command = new MyCommand(direction,_receiver,moveObj,distance);
		command.Execute();
		commands.Add(command);
		currentCommandNum++;
	}
	private void Undo(){
		if(currentCommandNum > 0 ){
			currentCommandNum--;
			MyCommand command= (MyCommand )commands[currentCommandNum];
			command.UnExecute();
		}
	}
	private void Redo(){
		if (currentCommandNum < commands.Count) { 
	    MyCommand command= (MyCommand )commands[currentCommandNum];
	    currentCommandNum++;
	    command.Execute();
		}
	}
	void OnGUI()
	{
	    string label = "   start";
	    if (currentCommandNum == 0)
	    {
	        label = ">" + label;
	    }
	    label += "\n";
	
	    for (int i = 0; i < commands.Count; i++)
	    {
	        if (i == currentCommandNum - 1)
	            label += "> " + commands[i].ToString() + "\n";
	        else
	            label += "   " + commands[i].ToString() + "\n";
	    }
	    GUI.Label(new Rect(0, 0, 400, 800), label);
	}
	 private void Update()
		 {
		     if (Input.GetKeyDown(KeyCode.UpArrow)|| Input.GetKeyDown(KeyCode.W)) 
		     { moveUp(); }
		     if (Input.GetKeyDown(KeyCode.DownArrow) || Input.GetKeyDown(KeyCode.S)) 
		     { moveDown(); }
		     if (Input.GetKeyDown(KeyCode.LeftArrow) || Input.GetKeyDown(KeyCode.A))
		      { moveLeft(); }
		     if (Input.GetKeyDown(KeyCode.RightArrow) || Input.GetKeyDown(KeyCode.D)) 
		     { moveRight(); }
		     if (Input.GetKeyDown(KeyCode.R))
		     { Redo(); }
		     if (Input.GetKeyDown(KeyCode.U))
		     { Undo(); }
		 }
	 void moveUp() { Move(Direction.Up); }
	 void moveDown() { Move(Direction.Down); }
	 void moveLeft() {  Move(Direction.Left); }
	 void moveRight() { Move(Direction.Right); }
}

现在就基本上已经做完了,是一个很简单的案例用来巩固学习命令模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2100957.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在线音乐播放器项目

在线音乐播放器项目 登录页面 注册页面 主页 上传文件 我的喜欢 前端 js html css 三剑客 后端 Spring Boot框架 插件有:Spring Boot DevTools、Lombok、Spring Web、MySQL Driver、MyBatis Framework、security、detect 数据库有 三张表 lovemusic、music、user 工具类( co…

pycharm的Structure是什么,怎么打开,每个图标的功能是什么

一、Structure的含义 在PyCharm中&#xff0c;Structure是一个非常有用的功能&#xff0c;它可以帮助开发者快速浏览和理解当前文件的代码结构&#xff0c;Structure视图通过不同的图标来表示代码中的不同元素。 二、如何打开Structure功能 在windows上可以通过Alt7来打开St…

VsCode + Go + macOS 小白 demo运行

1. 安装&#xff1a;brew install go 2. 设置工作目录和代理 ​ go env -w GOPATH/Users/niu/code/goexport GOPROXYhttps://goproxy.cngo env -w GO111MODULEongo env 查看上面三个值是否和设置的一样​ 3. 安装vscode. go插件 4. vscode打开GOPATH设置的工作目录 command…

ESP32无线WiFi芯片模组,设备物联网连接通信,产品智能化交互升级

在数字化浪潮的推动下&#xff0c;我们正步入一个万物互联的新时代。物联网&#xff08;IoT&#xff09;技术&#xff0c;作为连接物理世界与数字世界的桥梁&#xff0c;正逐渐渗透到我们生活的每一个角落。 乐鑫正通过其创新的无线WiFi芯片模组&#xff0c;为这些领域的发展提…

Linux动态监控系统

目录 动态监控进程 介绍 基本语法 选项说明 交互操作说明 应用实例 动态监控进程 介绍 top指令类似于ps命令&#xff0c;只是top在执行一段时间可以更新正在运行的进程。 基本语法 选项说明 负载那三个值加起来除以三若大于零点7就说明负载较大 &#xff0c;buff是占用…

全网最全的安服工程师修炼手册

全网最全安服工程师修炼手册 本篇文章主要介绍安全服务工程师的必备技能&#xff0c;也是简单记录下我的安服历程&#xff01; 思维导图附上 点击下载 基础技能 网络 IP IP概念&#xff1a;IP地址被用来给Internet上的电脑一个编号。日常见到的情况是每台联网的PC上都需要…

Faiss向量数据库

Faiss&#xff08;Facebook AI Similarity Search&#xff09;向量数据库是由Facebook AI研究院开发的一种高效相似性搜索和聚类的库。Faiss不仅支持在高维空间中进行高效的相似性搜索&#xff0c;还能够在处理大规模数据集时展现出卓越的性能&#xff0c;尤其适用于图像检索、…

C# SM2 SM3 SM4 使用

目录 效果 SM2 SM3 SM4 项目 代码 SM2Utils.cs Sm3Utils.cs Sm4Utils.cs 下载 效果 SM2 公钥&#xff1a;04ca3e272e11b5633681cb0fbbfd8c162be08918ce5b644cd33d49c17be8674caf6c20a11de8b65333924dfe7d42246abb4a4c36b663bef1aafc624a35acf4d2b1 私钥&#xff1a;…

多个视频怎么合成一个视频?这10款视频合并软件大家都在用,适合手机和电脑!

如果您希望利用拍摄的片段制作出色的电影或视频故事&#xff0c;选择合适的视频合并软件是非常关键的。此外&#xff0c;视频剪辑的复杂程度可能会让人感到意外&#xff0c;有时简单得让人吃惊。专业的视频剪辑合并大师能够大大简化视频合并的过程&#xff0c;这正是它们的价值…

『功能项目』主角的信息显示【16】

本章项目成果展示 我们打开上一篇15怪物的信息显示的项目&#xff0c; 本章要做的事情是对主角的UI信息实时显示 创建一个脚本&#xff1a;UIManager.cs 创建一个空物体作为钉子钉在左上角命名为LeftUp 创建Image做为头像 将以下资源导入Art文件夹 将以下资源图片放至Art文件夹…

思维导图软件全攻略:5款软件横向对比

思维导图作为一种图形化的工具&#xff0c;能够帮助我们更有效地组织和表达放射性思维。在学习和工作中&#xff0c;思维导图的作用不可小觑&#xff0c;它不仅帮助我们理清思路&#xff0c;还能提升我们的工作效率。通过可视化的方式&#xff0c;思维导图将复杂的信息分解成更…

JDK原理

当我们谈论JDK&#xff08;Java Development Kit&#xff09;的原理时&#xff0c;实际上是在探讨Java语言及其开发环境背后的技术和设计思想。JDK是Java编程语言的核心工具包&#xff0c;它包含了Java运行环境&#xff08;JRE&#xff09;、Java编译器&#xff08;javac&#…

U盘数据恢复哪家强?四款神器拯救你的文件!

随着科技的发展&#xff0c;我们越来越依赖于电子设备来储存和传输数据。然而&#xff0c;数据丢失的情况也时有发生&#xff0c;尤其是当我们的数据存储在U盘等移动设备上时。这时&#xff0c;U盘数据恢复软件就显得尤为重要了。本文将为大家介绍四款常用的U盘数据恢复软件&am…

按箭头上下左右来实现简单二层级树形结构

按箭头上下左右来实现简单二层级树形结构 .vue template内容 <div class"nav-container"><ul class"nav-list" :class"{ border-glow: status F }"><liv-for"(item, index) in items":key"index"click&…

iOS 18降级后遭遇“白苹果”?可试试这几种解决办法

随着苹果iOS系统的不断升级&#xff0c;用户们总是满怀期待地尝试最新的系统版本&#xff0c;但偶尔也会因为某些原因选择降级回旧版本。然而&#xff0c;iOS 18降级后遇到“白苹果”问题&#xff0c;无疑给许多用户带来了困扰。今天&#xff0c;我们就来探讨一下&#xff0c;当…

CAD二次开发IFoxCAD框架系列(26)- 分段测量多段线长度和计算多边形的面积

#region 分段测量多段线长度private static double textHight 10;[CommandMethod(nameof(PolylineDemo))]public void PolylineDemo(){using var tr new DBTrans();if(!tr.LayerTable.Has("标注")){tr.LayerTable.Add("标注",1);}var pso new PromptSel…

开绕组永磁电机驱动系统零序电流抑制策略研究(7)——基于零矢量重新分布的120°矢量解耦/中间六边形调制零序电流抑制策略

1.前言 很久没有更新过开绕组电机的仿真了。在一年前发了开绕组的各种调制策略。开绕组电机最常见的两种解耦调制就是120矢量解耦/中间六边形调制和180矢量解耦/最大六边形调制。 我当时想的是&#xff0c;180解耦调制/最大六边形调制的电压利用率最高&#xff0c;所以我就一直…

docker部署project-exam-system

使⽤docker部署project-exam-system 1. 背景&#xff0c;在⼀台主机之内&#xff0c;实现容器的编排&#xff0c;发布考试系统 2. 环境准备 1. docker 1. vim /etc/docker/daemon.json 2. docker-compos 3. 普通的部署 1. 镜像 1. 前端&#xff1a;nginx latest服务 1. 拉取…

Python实现贝叶斯优化器(Bayes_opt)优化深度森林(Deep Forest)分类模型(deepforest分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 深度森林是一种基于集成学习的机器学习方法&#xff0c;其设计灵感来源于深度学习的成功。它通过堆叠多…

2024年四款必备的Windows录屏工具推荐!

无论你是教育工作者、游戏主播、还是企业培训师&#xff0c;一款好的录屏工具都能让你的工作事半功倍。今天&#xff0c;我们就来探讨录屏工具几种不同的使用情境&#xff0c;并推荐几款适合相应情境的Windows录屏工具&#xff01; 福昕录屏大师 直达链接&#xff1a;www.fox…