java设计模式--命令模式(Command Pattern)

Java之命令模式(Command Pattern)

1.概念

  将来自客户端的请求传入一个对象,从而使你可用不同的请求对客户进行参数化。用于“行为请求者”与“行为实现者”解耦,可实现二者之间的松耦合,以便适应变化。分离变化与不变的因素。

   在面向对象的程序设计中,一个对象调用另一个对象,一般情况下的调用过程是:创建目标对象实例;设置调用参数;调用目标对象的方法。

但在有些情况下有必要使用一个专门的类对这种调用过程加以封装,我们把这种专门的类称作command类。

Command模式可应用于
a)整个调用过程比较繁杂,或者存在多处这种调用。这时,使用Command类对该调用加以封装,便于功能的再利用。
b)调用前后需要对调用参数进行某些处理。
c)调用前后需要进行某些额外处理,比如日志,缓存,记录历史操作等。

Command模式有如下效果:
a)将调用操作的对象和知道如何实现该操作的对象解耦。
b)Command是头等对象。他们可以像其他对象一样被操作和扩展。
c)你可将多个命令装配成一个符合命令。
d)增加新的Command很容易,因为这无需改变现有的类

 

java设计模式--命令模式(Command Pattern)

package command;

//命令 接收者(执行者)播放器
public class Player {

	public void turnOn(){
		
		System.out.println("打开");
	}
	
	public void turnOff(){
		System.out.println("关闭");
		
	}
	
	public void next(){
		
		System.out.println("下一曲");
	}
}

 命令接口:

package command;

public interface Command {

	public void execute();
}

 各种命令实现类:

package command;
//打开命令类
public class TurnOnCommand implements Command {

	private Player player;
	
	public TurnOnCommand(Player player) {
		this.player = player;
	}
	
	public void execute() {
		this.player.turnOn();
	}

}


package command;
//关闭命令类
public class TurnOffCommand implements Command {

private Player player;
	
	public TurnOffCommand(Player player) {
		this.player = player;
	}
	
	public void execute() {
		this.player.turnOff();
	}

}


package command;
//下一曲命令类
public class NextCommand implements Command {

private Player player;
	
	public NextCommand(Player player) {
		this.player = player;
	}
	
	public void execute() {
		this.player.next();
	}

}

 命令发送者类:

package command;
//命令发送类
public class PlayerInvoker {

	private TurnOnCommand on;
	private TurnOffCommand off;
	private NextCommand next;
	public PlayerInvoker(TurnOnCommand on,TurnOffCommand off,NextCommand next) {
		this.on = on;
		this.off = off;
		this.next = next;
	}
	
	public void turnOn(){		
		this.on.execute();
	}
	
	public void turnOff(){		
		this.off.execute();
	}
	
	public void next(){		
		this.next.execute();
	}
}

 

客户端测试类: 

package command; //测试类 public class Client{ public static void main(String[] args) { Player player = new Player(); TurnOnCommand on = new TurnOnCommand(player); TurnOffCommand off = new TurnOffCommand(player); NextCommand next = new NextCommand(player); PlayerInvoker invoker = new PlayerInvoker(on, off, next); invoker.turnOn(); invoker.turnOff(); invoker.next(); } }

优点:
降低系统的耦合度
新的命令可以很容易地加入到系统中
可以比较容易地设计一个组合命令

缺点:
使用命令模式可能会导致某些系统有过多的具体命令类。因为针对每一个命令都需要设计一个具体命令类,因此某些系统可能需要大量具体命令类,这将影响命令模式的使用。

适用环境:
系统需要将请求调用者和请求接收者解耦,使得调用者和接收者不直接交互。
系统需要在不同的时间指定请求,将请求排队和执行请求。
系统需要支持命令的撤销和恢复操作。
系统需要将一组操作组合在一起,即支持宏命令。

你可能感兴趣的:(java设计模式)