【设计模式】行为型06命令模式(Command Pattern)

命令模式

    个人理解:命令模式,本质上是一种多层次的封装。

    好处:降低耦合,扩展极其方便。

    以下一段文案摘抄自:http://www.runoob.com/design-pattern/command-pattern.html个人有些难以深入理解,待日后细细体会:

 

    意图:命令模式的目的就是达到命令的发出者和执行者之间解耦,实现请求和执行分开。

    主要解决:在软件系统中,行为请求者与行为实现者通常是一种紧耦合的关系,但某些场合,比如需要对行为进行记录、撤销或重做、事务等处理时,这种无法抵御变化的紧耦合的设计就不太合适。

    何时使用:在某些场合,比如要对行为进行"记录、撤销/重做、事务"等处理,这种无法抵御变化的紧耦合是不合适的。在这种情况下,如何将"行为请求者"与"行为实现者"解耦?将一组行为抽象为对象,可以实现二者之间的松耦合。

   如何解决:通过调用者调用接受者执行命令,顺序:调用者→接受者→命令。

 

    博主参考了网上很多例子,去掉了一些冗余功能,精简了demo使其更加便于理解,如下:

    类图(晚上画):

    代码:

    1、实际的请求类,拥有所有的具体功能:

package com.pat.command;


/**
 * 请求类-具体被操作
 * @author ZX
 */
public class Receiver{

	public void takeOff() {
		System.out.println("起飞功能");
	}
	public void land() {
		System.out.println("降落功能");
	}
	
}

2、命令的封装:

package com.pat.command;
/**
 * 命令类,所有的命令
 * @author ZX
 *
 */
public abstract class Command {
	public abstract void execute();
}
/**
 * 命令A
 * @author Administrator
 *
 */
class CommandA extends Command{
    Receiver receiver;
	@Override
	public void execute() {
		receiver.takeOff();
		
	}
	public CommandA(Receiver receiver) {
		this.receiver=receiver;
	}
}
/**
 * 命令B
 * @author Administrator
 *
 */
class CommandB extends Command{
    Receiver receiver;
	@Override
	public void execute() {
		receiver.land();
		
	}
	public CommandB(Receiver receiver) {
		this.receiver=receiver;
	}
}

3、控制中心:

package com.pat.command;
/**
 * 指挥中心
 * @author ZX
 *
 */
public class CommandCenter {
	private Command command;
	public CommandCenter(Command command) {
		this.command=command;
	}
	public void call() {
		command.execute();
	}
}

4、测试类:

package com.pat.command;

public class Test {
	public static void main(String[] args) {
		//指挥中心执行A命令
		CommandCenter APlan = new CommandCenter(new CommandA(new Receiver()));
		APlan.call();
		//指挥中心执行B命令
		CommandCenter BPlan= new CommandCenter(new CommandB(new Receiver()));
		BPlan.call();
	}
}

 

5、结果:

 

起飞功能
降落功能

 

posted @ 2018-05-05 12:45  黑猫先生  阅读(166)  评论(0编辑  收藏  举报