命令模式
简介
命令模式的目的是解除调用者和接受者之间的耦合。命令模式为相应客户请求的行动创建一个抽象,也就是设计一个命令接口类,用于声明一个共同的接口。该接口有一些具体的实现类,每个实现类代表一个不同类型的客户请求和相应的处理。
(1)客户类创建必要的接收器(Receiver)对象。
(2)客户类创建一个适当的命令(Command)对象并且将在步骤(1)创建的接收器对象配置给它。
(3)客户类创建Invoker对象,并且将在步骤(2)中创建的命令对象配置给它。
(4)Invoker对象调用命令对象的execute()方法。
示例
控制空调开关和电灯开关
class Invoker
{
private Command command;
public Invoker(Command command){this.command = command;}
void callCommand(){command.execute();}
}
public interface Command
{
public abstract void execute();
}
public class AirConditionOnCommand implements Command
{
private AirCondition ac;
public setAc(AirCondition ac){...}
public void execute()
{
ac.On();
}
}
public class AirConditionOffCommand implements Command
{
private AirCondition ac;
public setAc(AirCondition ac){...}
public void execute()
{
ac.Off();
}
}
public class LampOnCommand implements Command
{
private Lamp ac;
public setAc(Lamp ac){...}
public void execute()
{
ac.On();
}
}
public class LampOffCommand implements Command
{
private Lamp ac;
public setAc(Lamp ac){...}
public void execute()
{
ac.Off();
}
}
接受类
class AirCondition
{
public void On(){}
public void Off(){}
}
class Lamp
{
public void On(){}
public void Off(){}
}
调用
Lamp l = new Lamp();
LampOnCommand lo = new LampOnCommand();
lo.setAc(l);
Invoker invoker1 = new Invoker(lo);
invoker1.callCommand();
优点
(1)命令模式可以实现调用者和被调用者之间的解耦。
(2)命令模式容易扩展,上面的程序如果添加控制电视的开关的话,只要添加一个电视的接受类以及一个电视的控制类实体。
(3)命令模式支持将多个命令装配成一个复合命令,复合命令实际上市组合模式的一个实例。
(4)命令模式支持操作的取消与重做。需要对ConcreteCommand进行添加一些状态。