定义
将一个申请封装成一个对象。从而让你应用不同的申请把客户端参数化,对申请排队或者记录申请日志,能够提供命令的撤销和复原性能。
这是个高内聚的模式。
把申请方和执行方离开了。内聚到了命令外面。
优缺点
长处:
- 类间解耦 - 调用者和接受者角色之间没有任何依赖关系
- 易于扩大
- 能够联合其余模式
毛病是Command命令类容易收缩
高层次的模块不须要晓得接收者(执行者)是谁。
代码示例
篮球队训练指令
以篮球训练为例,定义一些命令
command/|-- cmd| |-- Command.java // 命令抽象类 - 在这里是战术| |-- InsideCommand.java // 打内线| `-- ThreePointCommand.java // 三分战术|-- Coach.java // 教练|-- player | |-- Center.java // 中锋| |-- Player.java // 运动员抽象类| |-- PointGuard.java // 控卫| `-- SmallForward.java // 小前锋`-- TestMain.java // 测试代码
先看指令抽象类,外面有对具体接收者的援用
public abstract class Command { // 可能调动的人员 protected Center center = new Center(); protected PointGuard pointGuard = new PointGuard(); protected SmallForward smallForward = new SmallForward(); public abstract void execute();}
运动员抽象类。运动员能执行一些动作。
public abstract class Player { public abstract void run(); public abstract void shoot(); public abstract void passBall(); public abstract void catchBall(); public abstract void dunk();}
教练类,就是指挥者
public class Coach { private Command command; public void setCommand(Command command) { this.command = command; } public void action() { this.command.execute(); }}
以下是各个人员类
public class Center extends Player { @Override public void run() { System.out.println("Center is running."); } @Override public void shoot() { System.out.println("Center shoots the ball"); } @Override public void passBall() { System.out.println("Center passes ball"); } @Override public void catchBall() { System.out.println("Center got the ball"); } @Override public void dunk() { System.out.println("Center dunk!"); }}public class PointGuard extends Player { @Override public void run() { System.out.println("PointGuard is running."); } @Override public void shoot() { System.out.println("PointGuard shoots the ball"); } @Override public void passBall() { System.out.println("PointGuard passes ball"); } @Override public void catchBall() { System.out.println("PointGuard got the ball"); } @Override public void dunk() { System.out.println("PointGuard dunk!"); }}public class SmallForward extends Player { @Override public void run() { System.out.println("SmallForward is running."); } @Override public void shoot() { System.out.println("SmallForward shoots the ball."); } @Override public void passBall() { System.out.println("SmallForward passes the ball."); } @Override public void catchBall() { System.out.println("SmallForward got the ball."); } @Override public void dunk() { System.out.println("SmallForward dunk."); }}
以下是简略的2个命令(战术)
public class InsideCommand extends Command { public InsideCommand() { } @Override public void execute() { System.out.println(getClass().getSimpleName() + ":"); super.pointGuard.catchBall(); super.center.run(); super.pointGuard.passBall(); super.center.catchBall(); super.center.dunk(); }}public class ThreePointCommand extends Command { public ThreePointCommand() { } @Override public void execute() { System.out.println(getClass().getSimpleName() + ":"); super.center.passBall(); super.pointGuard.catchBall(); super.smallForward.run(); super.pointGuard.passBall(); super.smallForward.catchBall(); super.pointGuard.run(); super.smallForward.passBall(); super.pointGuard.catchBall(); super.pointGuard.shoot(); }}
测试代码。定义一个教练,而后把战术实例交给教练,教练指挥队员执行战术
Coach coach = new Coach(); Command command1 = new InsideCommand(); Command command2 = new ThreePointCommand(); coach.setCommand(command1); coach.action(); System.out.println("------------------------------"); coach.setCommand(command2); coach.action();
输入
InsideCommand:PointGuard got the ballCenter is running.PointGuard passes ballCenter got the ballCenter dunk!------------------------------ThreePointCommand:Center passes ballPointGuard got the ballSmallForward is running.PointGuard passes ballSmallForward got the ball.PointGuard is running.SmallForward passes the ball.PointGuard got the ballPointGuard shoots the ball
【Android 零根底入门教程视频】
【Android 框架源码解析视频】
【Android 大厂面试题精讲视频】