命令模式

来源:互联网 发布:存储过程拼接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

0 0
原创粉丝点击