命令模式

来源:互联网 发布:雷克萨斯rx200t 知乎 编辑:程序博客网 时间:2024/06/03 20:09

1类图

这里写图片描述

2定义

2.1 将一个请求封装成一个对象,从而让用户使用不同的请求吧=把客户端参数化;对请求排队或者纪录请求日志,已经支持可撤销的操作。

3应用场景

3.1 需要抽象出待支持的动作,然后以参数的形式提供出来-类似于过程设计中的回调机制,而命令模式正是回调机制的一个面向对象的代替品。

3.2 在不同时刻指定,排序和执行请求。一个命令对象可以有与初始请求无关的生存期。

3.3 需要支持取消操作。

3.4 支持修改日志功能,这样当系统崩溃时,这些修改可以被重新做一遍。

3.5 需要支持事务操作。

通用模式:

4接收者类

public class Receiver {    public void action(){        System.out.println("执行具体操作");    }}

5抽象命令接口

public interface Command {    void execute();}

6具体命令类

public class ConcreteCommand implements Command {    private Receiver receiver;    public ConcreteCommand(Receiver receiver) {        this.receiver = receiver;    }    @Override    public void execute() {        receiver.action();    }}

7请求者类

public class Tnvoker {    private Command command;    public Tnvoker(Command command){        this.command = command;    }    public void action(){        command.execute();    }}

8客户类

public class Client {    public static void main(String[] args) {        Receiver receiver = new Receiver();        Command command = new ConcreteCommand(receiver);        Tnvoker tnvoker = new Tnvoker(command);        tnvoker.action();    }}

简单实现:

9接受者角色

public class TetrisMachine {    public void toLeft(){        System.out.println("向左");    }    public void toRight(){        System.out.println("向右");    }    public void fastToBottom(){        System.out.println("快速落下");    }    public void transform(){        System.out.println("改变形状");    }}

10命令者抽象

public interface Command {    void execute();}

11具体命令者 向左

    private TetrisMachine machine;    public LeftCommand(TetrisMachine machine){        this.machine = machine;    }    @Override    public void execute() {        machine.toLeft();    }}

12具体命令者 向右

public class RightCommand implements Command {private TetrisMachine machine;    public RightCommand(TetrisMachine machine){        this.machine = machine;    }    @Override    public void execute() {        machine.toRight();    }}

13请求者

public class Buttons {    private LeftCommand leftCommand;    private RightCommand rightCommand;    public void toLeft() {        leftCommand.execute();    }    public void setLeftCommand(LeftCommand leftCommand) {        this.leftCommand = leftCommand;    }    public void toRight() {        rightCommand.execute();;    }    public void setRightCommand(RightCommand rightCommand) {        this.rightCommand = rightCommand;    }}

14客户类

14.1标准模式

public class Player {    public static void main(String[] args) {        TetrisMachine machine = new TetrisMachine();        LeftCommand leftCommand = new LeftCommand(machine);        RightCommand rightCommand = new RightCommand(machine);        Buttons button = new Buttons();        button.setLeftCommand(leftCommand);        button.setRightCommand(rightCommand);        button.toLeft();        button.toRight();    }}

14.2简化模式

public class Player {    public static void main(String[] args) {        TetrisMachine machine = new TetrisMachine();        machine.toLeft();        machine.toRight();    }}
原创粉丝点击