Command Pattern:将请求封装成对象,这可以让你使用不同的请求,队列,或者是日志请求来参数化其他对象,命令模式也可以支持撤销操作。
命令模式有两种实现方式:
1. 在命令管理器中提供设置当前命令接受者的方法,当执行消息或者是有消息压入的时候直接将命令发送给当前设置的接受者。
2. 在命令管理器中建立一个命令接收器队列,通过注册和注销的方式动态增减,而每个接收器会接受到命令,但是只需要针对自己关心的命令进行处理即可。
第一种方式比较简单,忽略,重点完成第‘二种方式的测试;
然后适用下面的测试代码:
运行结果为:
1: ExecuteCommand
Light::LightOnCmd!
Door::DoorOnCmd!
Light::LightOffCmd!
Door::DoorOffCmd!
2: ExecuteCommand
Light::LightBrokenCmd
Light::UnknownCmd!
Door::DoorBrokenCmd!
从输出结果可以看出实现了简单的命令发送和执行双方的解耦,我们可以随时增减命令的接受者而不需要对原来已经编码好的模块或者类进行修改,这样就具有了很强的扩展性和可维护性,另外在程序里面我们将消息处理的返回做了一个扩展,返回三个值,其中新增的一个返回是“终止”,就是告诉命令管理器,这个命令是我的专属命令,已经执行完了,不需要再下发给其他的接受者了,他们根本不需要。这样提高了效率。
在游戏开发中,命令系统和消息系统是很常见的,实现的方法差不多。