今天我们讲命令模式,首先我们先从一个故事开始。

NBA2018-2019赛季,季后赛正如火如荼的进行中,今天来到的比赛正是西部总决赛休斯顿火箭队与金州勇士队的天王山之战。

这边火箭主帅德安东尼所派出的先发五虎是:哈登,保罗,卡佩拉,塔克,恩尼斯。勇士首发:库里,克莱,杜兰特,追梦,一哥

双方比赛开始库里,和杜兰特立马进入状态,为勇士先得5分,接着火箭这边又不甘示弱,由哈登一个超远三分还以颜色。比赛进行着,一个登哥始终不如对面几个全明星来的强大。火箭主帅见状不利,连忙叫了一个暂停,戈登换下了保罗,格林换下了塔克。

保罗,恩尼斯(下场)

戈登,格林(上场)

比赛继续,戈登和格林的上场立马为火箭扭转颓势,里突外投。连忙追上比分。

双方持续焦灼着,来到第二节。德安东尼见勇士队改打三角进攻,于是叫了暂停,换了场上的所有队员

哈登,卡佩拉,格林,戈登,塔克(下场)

保罗,恩尼斯,内内,周琦,奈特(上场)

这一上场,不得了,周琦有如神助一般,罚球线起跳一个战斧把追梦格林扣翻在地。可是伤愈付出的奈特不在状态,他又撤下了奈特让塔克上场,最终在周琦带领下火箭拿下了这场天王山之战,晋级NBA总决赛。(我保证该故事不带任何个人感情色彩)

在命令模式里,有三个主要角色。调用者(Invoker),命令(Command),接收者(Receiver)。在这个故事中,主教练德安东尼就是调用者,让“保罗换下戈登”就是一个具体命令,接收者是球员。

在命令中还要支持撤销功能,便形成如下类图

这样就能将三者Invoke,Command,Receiver相互解耦,互不影响对方实现。

接下来我们实现代码

package nba;/*** Created by huangx on 2018/11/22.*/
public interface Command {void execute();void undo();
}
package nba;/*** AttackCommand 进攻命令* Created by huangx on 2018/11/23.*/
public class AttackCommand implements Command {private Player attackPlayer;public AttackCommand(Player attackPlayer) {this.attackPlayer = attackPlayer;}public void execute() {attackPlayer.attact();}public void undo() {attackPlayer.defend();}
}
package nba;/*** 换人命令* Created by huangx on 2018/11/22.*/
public class SubstituteCommand implements Command {private Player upPlayer;private Player downPlay;public SubstituteCommand(Player up,Player down){this.upPlayer=up;this.downPlay=down;}public void execute() {upPlayer.up();downPlay.down();}public void undo() {downPlay.up();upPlayer.down();}
}
package nba;/*** Coach就是调用者Invoke* Created by huangx on 2018/11/22.*/
public class Coach {private Command command;  //如果是宏命令可将该Command设置成list//设值注入public void setCommand(Command command) {this.command = command;}//业务方法,用于调用命令类的execute()方法public void call() {command.execute();}//撤销命令public void undo() {command.undo();}}
package nba;/*** Player 球员即 接收者* Created by huangx on 2018/11/22.*/
public class Player {private String name;public Player(String name) {this.name = name;}public void up() {System.out.println(name + "正兴奋的上场");}public void down() {System.out.println(name + "正失望的下场");}public void attact() {System.out.println(name + "正血腥的进攻");}public void defend() {System.out.println(name + "正强悍的防守");}
}
package nba;/*** nba西部总决赛* Created by huangx on 2018/11/22.*/
public class NBAGame {public static void main(String[] args) {//德安东尼下命令让戈登换下保罗Player paul = new Player("gooden");Player gooden = new Player("paul");Command command = new SubstituteCommand(paul, gooden);Coach antoni = new Coach();antoni.setCommand(command);antoni.call();//德安东尼见势不对,撤销了刚下的命令,让保罗回来antoni.undo();//德安东尼让哈登趁热打铁,努力进攻Player harder = new Player("harder");Command harderattactCommand = new AttackCommand(harder);antoni.setCommand(harderattactCommand);antoni.call();}
}

同样该模式也支持宏命令,球场上球员五上五下就可以用宏命令来实现,将coach类里面的command维护成一个List集合便可。

命令模式定义:将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作

要具体理解的话,还是需要多看代码。

我的武林秘籍设计模式之命令模式相关推荐

  1. 我的武林秘籍设计模式之策略模式

    先从简单的鸭子游戏说起 jack为公司做了一套相当牛逼的鸭子游戏,鸭子能戏水,能呱呱叫.此系统内部设计使用了标准的oo技术,设计了一个鸭子超类,并让鸭子继承此超类 去年由于公司竞争压力加剧,在为期一周 ...

  2. 设计模式 之 命令模式

    2019独角兽企业重金招聘Python工程师标准>>> 设计模式 之 命令模式 命令模式比较简单,不过多赘述 为什么需要命令模式 将"行为请求者"与"行 ...

  3. 乐在其中设计模式(C#) - 命令模式(Command Pattern)

    原文:乐在其中设计模式(C#) - 命令模式(Command Pattern) [索引页] [源码下载] 乐在其中设计模式(C#) - 命令模式(Command Pattern) 作者:webabcd ...

  4. 23种设计模式之命令模式和策略模式的区别

    文章目录 概述 命令模式 策略模式 相同点 总结 概述 命令模式和策略模式确实很相似,只是命令模式多了一个接收者(Receiver)角色.它们虽然同为行为类模式,但是两者的区别还是很明显的.策略模式的 ...

  5. 设计模式之命令模式(Command)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  6. plsql执行command命令控制台出现乱码_设计模式系列 — 命令模式

    点赞再看,养成习惯,公众号搜一搜[一角钱技术]关注更多原创技术文章.本文 GitHub org_hejianhui/JavaStudy 已收录,有我的系列文章. 前言 23种设计模式速记 单例(sin ...

  7. 设计模式复习-命令模式

    #pragma once #include "stdafx.h" #include<set> #include<string> #include<io ...

  8. Java 设计模式之命令模式

    一.了解命令模式 1.1 什么是命令模式 命令模式将"请求"封装成对象,以便使用不同的请求.队列或者日志来参数化其他对象.命令模式也支持可撤销的操作.这种说法比较难以理解,换种说法 ...

  9. 设计模式:命令模式(Command)

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...

最新文章

  1. 一种将快捷方式从开始菜单“常用应用”的中去除的方法
  2. Linux用户配置密码,linux用户配置文件passwd和密码配置文件shadow,用户管理,组管理...
  3. 录制元素基于smartgwt框架项目如何开展自动化(一)
  4. taro引入f2图表_Package - taro-f2
  5. [BZOJ1222/Luogu2224][HNOI2001]产品加工
  6. perl与php,perl与php之异同
  7. java代码的接口_Java代码--简单接口的实现
  8. 敏捷开发绩效管理之三:个体动力之源——同行压力(松结对编程,师徒制度,跨职能团队,绩效考核)...
  9. DirectX11 With Windows SDK--07 添加光照与常用几何模型、光栅化状态
  10. MyBatis的懒加载(延迟加载)
  11. [转载] 由swap引出的java中参数严格值传递问题
  12. 一维搜索之黄金分割法
  13. 椰子树和平等 文:王小波
  14. 如何快速熟悉一套程序的框架结构
  15. mysql ubuntu 应用记录 --- Head First SQL (一)
  16. loadsh.js常用方法讲解
  17. 记录一次Git解决CONFLICT冲突
  18. 解读:政务信息资源整合共享难点分析及对策研究
  19. Java面向对象试题
  20. ASP.NET 技巧三

热门文章

  1. 小米盒子4c android,小米盒子4/4C规格曝光 有一定升级
  2. RTC时钟学习总结附带其他小总结
  3. (动态规划)股票交易日问题
  4. 文明重启怎么做RUST堡垒_文明重启怎么地下建房-地下建房技巧
  5. 当当吃海货,不算不会过
  6. 洛谷 P5536 【XR-3】核心城市(贪心 + 树形 dp 寻找树的中心)
  7. linux命令行恢复回收站,Trash-Cli:Linux 上的命令行回收站工具
  8. 大众点评app数据采集接口
  9. javascript入门基础篇重点 第二节2.
  10. 南加州大学计算机科学案例,南加州大学计算机科学录取案例