命令模式
来源:互联网 发布:存储过程拼接sql语句 编辑:程序博客网 时间:2024/06/02 07:33
一、定义:
将一个请求封装成一个对象, 从而让你使用不同的请求把客户端参数化, 对请求排队或者记录请求日志, 可以提供命令的撤销和恢复功能。
二、类图:
三、代码:
Group.class
/** * 组抽象类,定义各组的基本行为 */public abstract class Group { public abstract void find();//找到对应的组 public abstract void add();//增加 public abstract void delete();//减少 public abstract void change();//更改 public abstract void plan();//规划}
RequirementGroup.class
/** * 需求组 */public class RequirementGroup extends Group{ @Override public void find() { // TODO Auto-generated method stub System.out.println("找到需求组..."); } @Override public void add() { // TODO Auto-generated method stub System.out.println("客户要求增加一个需求..."); } @Override public void delete() { // TODO Auto-generated method stub System.out.println("客户要求减少一个需求..."); } @Override public void change() { // TODO Auto-generated method stub System.out.println("客户要求更改一个需求..."); } @Override public void plan() { // TODO Auto-generated method stub System.out.println("客户要求需求变更计划..."); }}
PageGroup.class
/** * 页面组 */public class PageGroup extends Group{ @Override public void find() { // TODO Auto-generated method stub System.out.println("找到页面组..."); } @Override public void add() { // TODO Auto-generated method stub System.out.println("客户要求增加一个页面..."); } @Override public void delete() { // TODO Auto-generated method stub System.out.println("客户要求删除一个页面..."); } @Override public void change() { // TODO Auto-generated method stub System.out.println("客户要求更改一个页面..."); } @Override public void plan() { // TODO Auto-generated method stub System.out.println("客户要求页面变更计划..."); }}
CodeGroup.class
/** * 编码组 */public class CodeGroup extends Group{ @Override public void find() { // TODO Auto-generated method stub System.out.println("找到编码组..."); } @Override public void add() { // TODO Auto-generated method stub System.out.println("客户要求增加一个功能..."); } @Override public void delete() { // TODO Auto-generated method stub System.out.println("客户要求减少一个功能..."); } @Override public void change() { // TODO Auto-generated method stub System.out.println("客户要求更改一个功能..."); } @Override public void plan() { // TODO Auto-generated method stub System.out.println("客户要求功能变更变化..."); }}
Command.class
/** * 命令抽象类,定义命令的基本属性和行为 */public abstract class Command { protected RequirementGroup requireGroup=new RequirementGroup();//需求组 protected PageGroup pageGroup=new PageGroup();//页面组 protected CodeGroup codeGroup=new CodeGroup();//编码组 public abstract void exec();//事件执行方法}
RequirementChangeCommand.class
/** * 需求变更命令类 */public class RequirementChangeCommand extends Command{ @Override public void exec() {//调用父类的需求组对象,实现具体的需求变更 // TODO Auto-generated method stub super.requireGroup.find(); super.requireGroup.change(); super.requireGroup.plan(); }}
AddPageCommand.class
/** * 增加页面命令类 */public class AddPageCommand extends Command{ @Override public void exec() {//调用父类的页面组对象,实现具体的增加页面命令 // TODO Auto-generated method stub super.pageGroup.find(); super.pageGroup.add(); super.pageGroup.plan(); }}
Invoker.class
/** * 命令接收者 */public class Invoker { private Command command;//接收到的命令 public void setCommand(Command command){//接收到客户发出的命令 this.command=command; } public void action(){ this.command.exec();//执行命令 }}
Client.class
/** * 场景类 */public class Client { public static void main(String[] args) { // TODO Auto-generated method stub Invoker invoker=new Invoker();//创建一个命令接收者 System.out.println("------客户要求更改一个需求------"); invoker.setCommand(new RequirementChangeCommand());//接受命令 invoker.action();//执行命令 System.out.println("------客户要求增加一个页面------"); invoker.setCommand(new AddPageCommand());//接受命令 invoker.action();//执行命令 }}
运行结果:
四、组成:
- Receiver 接收者角色
负责执行具体的命令,例如上面代码中的RequirementGroup.class,PageGroup.class,CodeGroup.class。
- Command 命令角色
需要执行的所有命令都在这里执行。例如上例中的RequirementChangeCommand.class,AddPageCommand.class。
- Invoker 命令调用者角色
接收到命令,并执行命令。
五、优点:
● 类间解耦
调用者角色与接收者角色之间没有任何依赖关系, 调用者实现功能时只需调用Command抽象类的execute方法就可以, 不需要了解到底是哪个接收者执行。
● 可扩展性
Command的子类可以非常容易地扩展, 而调用者Invoker和高层次的模块Client不产生严重的代码耦合。
● 命令模式结合其他模式会更优秀
命令模式可以结合责任链模式, 实现命令族解析任务; 结合模板方法模式, 则可以减少Command子类的膨胀问题。
六、缺点:
命令模式也是有缺点的, 请看Command的子类: 如果有N个命令, 问题就出来了, Command的子类就可不是几个, 而是N个, 这个类膨胀得非常大, 这个就需要读者在项目中慎重考虑使用。
Demo
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- 命令模式
- POJ 2104 kth number 主席树(可持久化线段树)[指针实现]
- 经典递归算法之哈诺塔问题
- Android Studio IDE安装包
- Jquery选择器大全
- 微信响应超过5秒重试解决方案
- 命令模式
- 彻底理解Promise对象——用es5语法实现一个自己的Promise(上篇)
- C++之多态
- Navicat如何将网格隐藏?
- Java中的ArrayList的初始容量和容量分配
- SQL COUNT() 函数
- 函数式编程入门教程
- 前端静态资源版本更新与缓存之——通过gulp 在原html文件上自动化添加js、css版本号
- Drools6.4从入门到精通