命令模式
命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。
模式结构
command:定义命令的接口,声明执行的方法。
concretecommand:命令接口实现对象,是“虚”的实现,永昌汇持有接收者,并调用接受者的功能来完成要执行的操作。
receiver:接受者,真正执行命令的对象,任何类都有可能成为一个接收者,只要它能够实现命令要求实现的相应的功能。
invoker:要求命令对象执行的请求,通常会持有命令对象,可以持有很多的额命令对象,这个是客户端真正触发命令要求命令执行相应操作的地方,就是使用命令对象的入口。
client:创建具体的命令对象,并且设置命令对象的接收者。
结构UML图
代码示例
command:
package com.tian.command;
/**
* 定义一个命令类来声明执行操作的抽象类
* @author Administrator
*
*/
public abstract class Command {
protected TVReceiver receiver;
public Command(TVReceiver receiver) {
this.receiver = receiver;
}
public abstract void execute();
}
ConcreteCommand:
打开电视命令
package com.tian.command;
/**
* 打开电视机命令
* @author Administrator
*
*/
public class ConcreteCommandOnOpen extends Command {
public ConcreteCommandOnOpen(TVReceiver receiver) {
super(receiver);
}
@Override
public void execute() {
receiver.onOpen();
}
}
关闭电视命令
package com.tian.command;
/**
* 关闭电视命令
* @author Administrator
*
*/
public class ConcreteCommandOnOff extends Command {
public ConcreteCommandOnOff(TVReceiver receiver) {
super(receiver);
}
@Override
public void execute() {
receiver.onOff();
}
}
Receiver:
package com.tian.command;
/**
* 电视命令接收者(相当于遥控器)
* @author Administrator
*
*/
public class TVReceiver {
public void onOpen() {
System.out.println("打开电视机。。。。。");
}
public void onOff() {
System.out.println("关闭电视机。。。。");
}
}
Invoker:
package com.tian.command;
/**
* 命令对象的执行请求
* @author Administrator
*
*/
public class Invoker {
private Command command;
public Invoker(Command command) {
this.command = command;
}
public void doAction() {
command.execute();
}
}
Client:
package com.tian.command;
public class Client {
public static void main(String[] args) {
TVReceiver receiver = new TVReceiver();
ConcreteCommandOnOff commandOnOff = new ConcreteCommandOnOff(receiver);
// ConcreteCommandOnOpen commandOnOpen = new ConcreteCommandOnOpen(receiver);
Invoker invoker = new Invoker(commandOnOff);
// Invoker invoker = new Invoker(commandOnOpen);
invoker.doAction();
}
}
命令模式的优点:
降低对象之间的耦合性
命令模式使得发起命令的对象——客户端,和具体实现命令的对象——接收者对象完全解耦,两者不需要知道各自的实现。
新命令动态的加入到系统中
命令模式把请求封装起来,可以动态的进行操作。
更加容易的设计组合命令
命令模式中的命令对象能够很容易地设计成复合命令,从而使系统更加灵活、强大。
更好的扩展性
调用同一方法实现不同的功能
命令模式的的缺点:
如果系统的命令过多,会导致系统需要大量的具体命令类