命令模式

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

输入图片说明

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

  • 客户(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,欢迎下载

转载于:https://my.oschina.net/sunchm/blog/1588897

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值