您的位置:首页 > 其它

Design Pattern 之 命令模式

2015-10-15 11:07 337 查看
命令模式:对命令进行封装,将发出命令的责任和执行命令的责任分割开。

根据面向接口编程的原则,首先要有一个命令的接口类



所有的具体命令都继承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()
{

4000
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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  设计模式