命令模式(Command)—挤奶工挤奶

来源:互联网 发布:小米免费网络通信 编辑:程序博客网 时间:2024/04/29 00:58

定义:

命令模式属于对象的行为模式,又叫行动模式、交易模式。

命令模式把一个请求或者操作封装到一个对象中,命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。

角色:

客户端(Client)角色:创建一个具体命令对象(ConcreteCommand),并确定接收者。

命令(Command)角色:声明一个给所有具体命令对象的接口。

具体命令(ConcreteCommand)角色:定义一个接收者与行为之间的弱耦合,调用接收者的执行方法。

请求者(Invoker)角色:负责调用命令对象执行相应的请求。

接收者(Receiver)角色:负责具体执行相应的操作。

例子:

养牛场都有挤奶器(MilkMachine),工人(Worker)通过操作面板(KeyBoard)来执行挤奶的工作,加入有两个简单操作,开始(PlayCommand) 停止(StopCommand),则整个链条就完整了。工人(Worker)是客户端角色,工人通过面板(KeyBoard)负责创建具体的命令对象,此时面板便是请求者角色,具体的命令对象就是开始、停止按钮,最后的接收者是挤奶器(MilkMachine)扮演接收者角色。

类图:


代码如下:

/** * 请求者角色 * 键盘类对象 * @author wang */public class KeyBoard {//持有命令对象private Command playCommand;private Command stopCommand;public void setPlayCommand(Command playCommand){this.playCommand = playCommand;}public void setStopCommand(Command stopCommand){this.stopCommand = stopCommand;}//执行启动命令public void play(){playCommand.execute();}//执行停止命令public void stop(){stopCommand.execute();}}/** * 命令角色 * @author wang */public interface Command {/** * 执行方法 */public void execute();}/** * 具体命令角色类 * 开始命令 * @author wang */public class PlayCommand implements Command {    //持有接收者对象private MilkMachine milkMachine = null;//构造方法public PlayCommand(MilkMachine milkMachine){this.milkMachine = milkMachine;}public void execute() {// TODO Auto-generated method stub//调用接收者对象,执行操作        milkMachine.play();}}/** * 具体命令角色类 * 停止命令 * @author wang */public class StopCommand implements Command {    //持有接收者对象private MilkMachine milkMachine = null;//构造方法public StopCommand(MilkMachine milkMachine){this.milkMachine = milkMachine;}public void execute() {// TODO Auto-generated method stub        //调用接收者对象,执行操作milkMachine.stop();}}/** * 接收者角色 * 挤奶器类 * 负责执行操作 * @author wang */public class MilkMachine {public void play(){System.out.println("开始挤奶");}public void stop(){System.out.println("停止挤奶");}}/** * 客户端角色 * 挤奶工人类 * @author wang */public class Worker {public static void main(String args[]){//创建接收者对象MilkMachine milkMachine = new MilkMachine();//创建命令对象Command playCommand = new PlayCommand(milkMachine);Command stopCommand = new StopCommand(milkMachine);//创建请求者对象KeyBoard keyBoard = new KeyBoard();keyBoard.setPlayCommand(playCommand);keyBoard.setStopCommand(stopCommand);//测试keyBoard.play();keyBoard.stop();}}
运行结果:

优点:

将请求的发起端与请求的执行端彻底的解耦。

0 0
原创粉丝点击