-
命令模式
将一个请求封装为一个对象,从而可以用不同的请求对对象进行参数化。
-
适用性
1)抽象出待执行的动作以参数化某对象。
2)支持取消操作。
3)支持修改日志,这样当系统崩溃时,这些修改可以被重做一遍。 -
举例
例如古代皇帝想做什么就做什么,只需要下达命令即可。
-
UML类图
-
代码示例
- 定义一个接收者,知道如何实施与执行一个请求相关的操作
package com.jin.demo.DesignPatterns.Command; /** * 执行者 * @auther jinsx * @date 2019-05-10 11:14 */ public class Receiver { public Object add(Object obj){ System.out.println("添加任务:" + obj); return "成功添加任务"; } public Object delete(Object obj){ System.out.println("删除任务:" + obj); return "成功删除任务"; } public Object change(Object obj){ System.out.println("修改任务:" + obj); return "成功修改任务"; } public Object find(Object obj){ System.out.println("查看任务:" + obj); return "成功查看任务"; } }
- 声明执行操作的抽象类
package com.jin.demo.DesignPatterns.Command; /** * 命令 * @auther jinsx * @date 2019-05-10 15:42 */ public abstract class Command { // 定义执行者引用 protected Receiver receiver; public Command(Receiver receiver) { this.receiver = receiver; } // 要执行的任务 public abstract Object execute(Object obj); }
- 将一个接收者对象绑定于一个动作,调用接收者相应的操作,以实现Execute
添加命令
删除命令package com.jin.demo.DesignPatterns.Command; /** * 添加命令 * @auther jinsx * @date 2019-05-10 15:44 */ public class AddCommand extends Command { public AddCommand(Receiver receiver) { super(receiver); } @Override public Object execute(Object obj) { System.out.println("---先查看,再添加,不做重复工作---"); receiver.find(obj); return receiver.add(obj); } }
修改命令package com.jin.demo.DesignPatterns.Command; /** * 删除命令 * @auther jinsx * @date 2019-05-10 15:54 */ public class DeleteCommand extends Command { public DeleteCommand(Receiver receiver) { super(receiver); } @Override public Object execute(Object obj) { System.out.println("---不管有没有,直接删除就行---"); return receiver.delete(obj); } }
查看命令package com.jin.demo.DesignPatterns.Command; /** * 修改命令 * @auther jinsx * @date 2019-05-10 15:56 */ public class ChangeCommand extends Command { public ChangeCommand(Receiver receiver) { super(receiver); } @Override public Object execute(Object obj) { System.out.println("---修改前,要查看是否有此任务---"); receiver.find(obj); return receiver.change(obj); } }
package com.jin.demo.DesignPatterns.Command; /** * 查看命令 * @auther jinsx * @date 2019-05-10 16:01 */ public class FindCommand extends Command { public FindCommand(Receiver receiver) { super(receiver); } @Override public Object execute(Object obj) { System.out.println("---想看,就给你看---"); return receiver.find(obj); } }
- 调用者
package com.jin.demo.DesignPatterns.Command; /** * 调用者 * @auther jinsx * @date 2019-05-10 16:06 */ public class Invoker { private Command command; public void setCommand(Command command) { this.command = command; } public Object execute(Object obj){ return command.execute(obj); } }
- 创建一个测试类
package com.jin.demo.DesignPatterns.Command; /** * 测试类 * @auther jinsx * @date 2019-05-10 16:15 */ public class TestCommand { public static void main(String[] args) { System.out.println(">>>始皇陛下今天心血来潮,建个阿房宫玩玩吧"); Invoker i = new Invoker(); i.setCommand(new AddCommand(new Receiver())); System.out.println(i.execute("建设阿房宫")); System.out.println(">>>始皇陛下今天有了新的想法"); i.setCommand(new ChangeCommand(new Receiver())); System.out.println(i.execute("修改阿房宫建设位置")); System.out.println(">>>始皇陛下今天想看看阿房宫建设进度"); i.setCommand(new FindCommand(new Receiver())); System.out.println(i.execute("查看阿房宫建设进度")); System.out.println(">>>始皇陛下今天醒悟啦"); i.setCommand(new DeleteCommand(new Receiver())); System.out.println(i.execute("终止建设阿房宫")); } }
- 执行测试结果
>>>始皇陛下今天心血来潮,建个阿房宫玩玩吧 ---先查看,再添加,不做重复工作--- 查看任务:建设阿房宫 添加任务:建设阿房宫 成功添加任务 >>>始皇陛下今天有了新的想法 ---修改前,要查看是否有此任务--- 查看任务:修改阿房宫建设位置 修改任务:修改阿房宫建设位置 成功修改任务 >>>始皇陛下今天想看看阿房宫建设进度 ---想看,就给你看--- 查看任务:查看阿房宫建设进度 成功查看任务 >>>始皇陛下今天醒悟啦 ---不管有没有,直接删除就行--- 删除任务:终止建设阿房宫 成功删除任务
- 定义一个接收者,知道如何实施与执行一个请求相关的操作
-
点击Java之23种设计模式查看更多的设计模式