命令模式
个人理解:命令模式,本质上是一种多层次的封装。
好处:降低耦合,扩展极其方便。
以下一段文案摘抄自: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、结果:
起飞功能
降落功能