命令模式:对命令进行封装,将发出命令的责任和执行命令的责任分割开。
根据面向接口编程的原则,首先要有一个命令的接口类
所有的具体命令都继承ICommand接口,并实现它的execute()方法,这样的话我们只是针对ICommand进行编程,不用考虑具体的实现了。
还是用哪个遥控器的例子吧,遥控器上有两组按钮,一组是控制电视开和关,另一组是控制空调开和关。这样的话,遥控器就是命令发出者,电视和空调就是命令执行者,将这两者解耦就是命令模式要做的事情。
接下来就是将电视和空调的命令封装成类,并继承ICommand,实现execute方法
TVCommand和AirConditonerCommand是电视和空调的命令类,它们继承ICommand
TVManager和AirConditionerManager是电视和空调的控制类,这里面是功能的具体实现
都目前,我们关于电视和空调的命令类都完成了,接下来就是遥控器的类了
遥控器类有一个私有vector来保存那个slot对应那个command,一个push方法将命令加入到遥控器中,一个回调方法onPress,在遥控器按钮被按下时调用,下面是类图:
代码示例:
public interface ICommand
{
public void execute(boolean isOn);
}
//电视机的command
public class TVCommand implements ICommand
{
@Override
public void execute(boolean isOn)
{
TVManager manager = new TVManager();
if (isOn)
{
manager.setOn();
} else
{
manager.setOff();
}
}
}
//空调的command
public class AirConditionerCommand implements ICommand
{
@Override
public void execute(boolean isOn)
{
AirConditionerManager manager = new AirConditionerManager();
if (isOn)
{
manager.setOn();
} else
{
manager.setOff();
}
}
}
//遥控器的实现
public class RemoteControl
{
private Vector<ICommand> vtrCommand;
public RemoteControl(int size)
{
vtrCommand = new Vector<ICommand>();
vtrCommand.setSize(size);
}
public void push(int slot , ICommand command)
{
vtrCommand.set(slot, command);
}
public void onPress(int slot , boolean isOn)
{
vtrCommand.get(slot).execute(isOn);
}
}
//电视机厂商功能实现
public class TVManager
{
public void setOn()
{
System.out.println("TV is On..");
}
public void setOff()
{
System.out.println("TV is Off..");
}
}
//空调厂商功能实现
public class AirConditionerManager
{
public void setOn()
{
System.out.println("AirConditioner is On..");
}
public void setOff()
{
System.out.println("AirConditioner is Off..");
}
}
//具体执行。。。。。
public static void main(String[] args)
{
System.out.println("command");
RemoteControl control = new RemoteControl(2);
control.push(0, new TVCommand());
control.push(1, new AirConditionerCommand());
control.onPress(0, true);
control.onPress(0, false);
}