设计模式:命令模式(command Pattern)

命令模式是对命令的封装。命令模式把发出命令的责任和执行命令的责任分割开,委派给不同的对象。

我们使用遥控器的例子来说明一下命令模式

1>新建一个Command(命令)接口

package com.kaishengit.command;

public interface Command {
	//命令对象方法
	public void execute();
}

 2>新建一个遥控器(发出命令对象)类:RemoteControl.java 

package com.kaishengit.command;

import java.util.ArrayList;
import java.util.List;

public class RemoteControl {
	
	//用于存放命令
	private List<Command> commandList = new ArrayList<Command>();
	
	/**
	 * 向遥控器中添加命令
	 * @param command
	 */
	public void setCommand(Command command){
		commandList.add(command);
	}
	
	/**
	 * 按下按键执行第几个命令
	 * @param index
	 */
	public void buttonWasPressed(int index){
		commandList.get(index - 1).execute();
	}
}

 3>新建两个电器(执行命令对象):电灯类、电视类

package com.kaishengit.command;

//1.电灯类
public class Light {
	public void on(){
		System.out.println("灯亮了!");
	}
}
package com.kaishengit.command;

//2.电视类
public class Tv {
	public void on(){
		System.out.println("打开电视!");
	}
}
 

4>新建两个命令对象类(实现Command接口):控制电灯、控制电视

package com.kaishengit.command;
//1.控制电灯
public class LightOnCommand implements Command{

	private Light light;
	
	/**
	 * 传入控制的对象:电灯
	 * @param light
	 */
	public LightOnCommand(Light light){
		this.light = light;
	}
	
	/**
	 * 执行命令:打开灯
	 */
	@Override
	public void execute() {
		light.on();
	}
	
}
package com.kaishengit.command;
//2.控制电视
public class TurnTvCommand implements Command{

	private Tv tv;
	
	public TurnTvCommand (Tv tv){
		this.tv = tv;
	}
	@Override
	public void execute() {
		tv.on();
	}

}
 

 5>测试一下

package com.kaishengit.command;

public class Test {
	public static void main(String[] args) {
		//创建遥控器
		RemoteControl remoteControl = new RemoteControl();
		//开灯命令
		LightOnCommand lightOnCommand  = new LightOnCommand(new Light());
		//打开电视命令
		TurnTvCommand turnTvCommand = new TurnTvCommand(new Tv());
		
		//将命令捆绑到遥控器上
		remoteControl.setCommand(turnTvCommand);
		remoteControl.setCommand(lightOnCommand);
		
		//按下按钮
		remoteControl.buttonWasPressed(1);//执行第一个命令
		//remoteControl.buttonWasPressed(2);//执行第二个命令
	}
}

 执行结果:

---------------------------------

打开电视!

---------------------------------

ok....

宏命令:是对子命令的结合体,一连串命令。

比如这里,我们创建一个宏命令:先开灯,再开电视

1>新建一个宏命令对象(实现Command接口):MacroCommand.java 

package com.kaishengit.command;
//宏命令
public class MacroCommand implements Command{

	private Command[] commands;
	
	/**
	 * 传入命令列表
	 * @param commands
	 */
	public MacroCommand(Command...commands){
		this.commands = commands;
	}
	
	/**
	 * 依次执行命令列表中的命令
	 */
	@Override
	public void execute() {
		for(Command command : commands){
			command.execute();
		}
	}
	
}

 2>我们测试一下我们新建的宏命令对象

package com.kaishengit.command;

public class Test {
	public static void main(String[] args) {
		//创建遥控器
		RemoteControl remoteControl = new RemoteControl();
		
		//开灯命令
		LightOnCommand lightOnCommand  = new LightOnCommand(new Light());
		//开电视命令
		TurnTvCommand turnTvCommand = new TurnTvCommand(new Tv());
		
		//我们创建的宏命令,传入命令列表:1.开灯命令、2.开电视命令
		MacroCommand mc = new MacroCommand(lightOnCommand,turnTvCommand);
		
		//将宏命令捆绑到遥控器上
		remoteControl.setCommand(mc);
	
		//按下按钮,执行宏命令
		remoteControl.buttonWasPressed(1);
	}
}

 运行结果:

-------------------

灯亮了!

打开电视!

-------------------

ok。。。

关于命令模式

1.命令模式将发出请求的对象和执行请求的对象解耦

2.在被解耦的两者之间间是通过命令对象进行沟通的,命令对象封装了一个或一组动作

3.调用者通过调用命令对象的execute方法发出请求,这使得接收者对象的劢作被调用

4.宏命令是命令的一种简单延伸,允许调用多个命令

end....

猜你喜欢

转载自meigesir.iteye.com/blog/1504221