命令模式: 将请求封闭成对象,这可以让你使用不同的请求,队列.或者日志请求来参数化其他对象.命令模式式可支持撤销技术操作.
好处:
◆很容易构造一个命令队列
◆记录相关的命令日志
◆增加命令的状态,实现命令的撤销和重做
◆允许接受请求的一方决定是否可做
◆新的命令轻而易举可以加入其中
缺点:可能会有过多的具体命令类存在
实现:
也不难,第一步关键是建立Command对象。拥有点面向对象的思想,就知道把它先抽象,让继承它的对象去具体实现。Client对象是发布命令的。Invoker对象是传递命令的,就是跑腿的。Receiver是受气包,底层最累的程序员,负责干活吧。看看下面的类图就清晰了:
[img]http://www.dabaoku.com/dabaoku/uploads/allimg/091114/21324911A-0.jpg[/img]
好处:
◆很容易构造一个命令队列
◆记录相关的命令日志
◆增加命令的状态,实现命令的撤销和重做
◆允许接受请求的一方决定是否可做
◆新的命令轻而易举可以加入其中
缺点:可能会有过多的具体命令类存在
实现:
也不难,第一步关键是建立Command对象。拥有点面向对象的思想,就知道把它先抽象,让继承它的对象去具体实现。Client对象是发布命令的。Invoker对象是传递命令的,就是跑腿的。Receiver是受气包,底层最累的程序员,负责干活吧。看看下面的类图就清晰了:
[img]http://www.dabaoku.com/dabaoku/uploads/allimg/091114/21324911A-0.jpg[/img]
public interface Switch {
public void open();
public void close();
}
public class TVSwitch implements Switch{
@Override
public void close() {
System.out.println("close the TV");
}
@Override
public void open() {
System.out.println("open the TV");
}
public void pause(){
System.out.println("pasue the TV");
}
}
public class LightSwitch implements Switch {
@Override
public void close() {
System.out.println("close the light");
}
@Override
public void open() {
System.out.println("open the light");
}
}
public interface Command {
public LightSwitch ls=new LightSwitch();
public TVSwitch tvs=new TVSwitch();
public void execute();
}
public class OpenTVCommand implements Command {
@Override
public void execute() {
tvs.open();
}
}
public class Invoker {
Command command;
public void setCommand(Command command) {
this.command = command;
}
public void execute(){
command.execute();
}
}
public class Test {
public static void main(String[] args){
Invoker in=new Invoker();
in.setCommand(new OpenTVCommand());
in.execute();
}
}