`

命令模式

阅读更多

命令模式将发出命令的对象和执行命令的对象解耦。

发出命令的对象是遥控器(调用者),执行命令的对象是电视(接收者)。

 

如何将调用者和接收者解耦:

利用命令对象,把命令(例如打开电视机)封装成一个命令对象。

让遥控器按钮存储一个命令对象,那么当按钮被按下的时候,就可以使用命令对象做相关的工作。

遥控器并不需要知道工作内容是什么,只要有一个命令对象和遥控器沟通,把电视打开就可以了。 这样遥控器和电视就解耦了。

 

在被解耦的两者之间是通过命令对象进行沟通的。

命令对象封装了接收者(电视机)的一个或一组动作,并且只暴露出一个execute()方法,当此方法被调用的时候,接收者就会进行这些动作。

 

package com.ez.impl;

import com.ez.Command;
/**
 * 命令模式,将发出命令的对象(遥控器)和执行命令的对象(电视机)解耦。
 * @author 窗外赏雪(EZ编程网)
 */
public class Test {
	public static void main(String[] args) {
		//创建一台电视机,就是命令的接收者
		TV tv=new TV();
		//命令对象封装了接收者(电视机)的一个或一组动作,并且只暴露出一个execute()方法,当此方法被调用的时候,接收者就会进行这些动作。
		Command command=new TVOnCommand(tv);
		//调用者,传入一个命令对象,可以执行命令
		Telecontroller telecontroller = new Telecontroller();
		telecontroller.setCommand(command);
		telecontroller.buttonPress();
	}
}

 

package com.ez;
/**
 * 命令接口,所有的命令对象实现该接口 
 * @author 窗外赏雪(EZ编程网)
 */
public interface Command {
	void execute();
}

 

package com.ez.impl;

import com.ez.Command;
/**
 * 命令对象,封装了接收者(电视机)的一个或一组动作,并且只暴露出一个execute()方法,
 * 当此方法被调用的时候,接收者就会进行这些动作。
 * @author 窗外赏雪(EZ编程网)
 */
public class TVOnCommand implements Command{
	TV tv;
	
	public TVOnCommand(TV tv) {
		this.tv = tv;
	}

	@Override
	public void execute() {
		tv.on();
	}

}

 

package com.ez.impl;
/**
 * 命令接收者
 * @author 窗外赏雪(EZ编程网)
 */
public class TV {
	public void on(){
		System.out.println("打开电视机");
	}
}

 

package com.ez.impl;

import com.ez.Command;
/**
 * 发出命令的对象是遥控器(调用者),持有一个命令对象。
 * @author 窗外赏雪(EZ编程网)
 */
public class Telecontroller {
	private Command command;
	
	public Telecontroller() {}
	
	public void setCommand(Command command) {
		this.command = command;
	}
	//按下按钮,发出命令,调用命令对象的execute()方法
	public void buttonPress(){
		command.execute();
	}
}

 

应用场景:

工作队列对象不在乎到底做些什么,它们只知道取出命令对象,然后调用其execute()方法。类似地,它们只要是实现命令模式的对象,就可以放入队列中,当线程可用时,就调用此对象的execute()方法。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics