命令模式

来源:互联网 发布:延保 知乎 编辑:程序博客网 时间:2024/06/04 18:25

命令模式:将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。

输入图片说明

命令模式涉及到五个角色,他们分别是:

  • 客户(Client)角色:创建了一个具体命令(ConcreteCommand)对象并确定其接收者。
  • 命令(Command)角色:声明了一个给所有具体命令类的抽象接口。这是一个抽象角色,通常由一个Java接口或Java抽象类实现。
  • 具体(ConcreteCommand)命令角色:定义一个接收者和行为之间的弱耦合;实现execute()方法,负责调用接收者的相应操作。execute()方法通常叫做执行方法。
  • 请求者(Invoker)角色:负责调用命令对象执行请求,相关的方法叫做行动方法。
  • 接收者(Receiver)角色:负责具体实施和执行一个请求。任何一个类都可以成为接收者,实施和执行请求的方法叫做行动方法。

举个栗子:

假设电视机有三个操作:开机、关机和换台,可以将其看做是命令。电视机的遥控器相当于请求者(Invoker)的角色,操作者Sun相当于次系统的客户,电视机本身就是命令的接收者。代码如下:

操作者Sun类(客户角色):

package command;public class Sun{    public static void main(String[] args) {        test();    }    private static void test() {        Tv myTv = new Tv();        OnCommand on = new OnCommand(myTv);        OffCommand off = new OffCommand(myTv);        ChannelCommand channel = new ChannelCommand(myTv, 2);        Control control = new Control(on,off,channel);        control.turnOn();        control.turnOff();        control.changeChannel();    }}

遥控器Control类(请求者角色):

package command;public class Control {    private Command onCommand,offCommand,changeChannel;    public Control(Command on, Command off, Command channel){        onCommand = on;        offCommand = off;        changeChannel = channel;    }    /**     * 行动方法     */    public void turnOn(){        onCommand.execute();    }    /**     * 行动方法     */    public void turnOff(){        offCommand.execute();    }    /**     * 行动方法     */    public void changeChannel(){        changeChannel.execute();    }}

命令角色(Command):

package command;public interface Command {    void execute();}

具体命令角色(ConcreteCommand):

开机OnCommand 类:

package command;public class OnCommand implements Command {    private Tv myTv;    public OnCommand(Tv tv){        myTv = tv;    }    /**     * 执行方法     */    @Override    public void execute() {        myTv.turnOn();    }}

关机OffCommand 类:

package command;public class OffCommand implements Command {    private Tv myTv;    public OffCommand(Tv tv){        myTv = tv;    }    /**     * 执行方法     */    @Override    public void execute() {        myTv.turnOff();    }}

换台ChannelCommand 类:

package command;public class ChannelCommand implements Command {    private Tv myTv;    private int channel;    public ChannelCommand(Tv tv,int channel){        myTv = tv;        this.channel = channel;    }    /**     * 执行方法     */    @Override    public void execute() {        myTv.changeChannel(channel);;    }}

电视机本身Tv 类(接收者角色):

package command;public class Tv {    private int currentChannel= 0;    /**     * 行动方法     */    public void turnOn(){        System.out.println("The television is on.");    }    /**     * 行动方法     */    public void turnOff(){        System.out.println("the television is off.");    }    /**     * 行动方法     */    public void changeChannel(int channel){        currentChannel = channel;        System.out.println("Now TV channel is" + channel);    }}

源码链接:命令模式代码demo,欢迎下载

原创粉丝点击