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

定义:

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

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

角色:

客户端(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();
	}
	
}
运行结果:

优点:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值