命令模式(Command Pattern):将一个请求封装为一个对象,从而使我们可用不同的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操作。
命令模式包含如下角色:
Command(抽象命令类):一般是一个接口,在其中声明了用于执行请求的excute()等方法,通过这些方法可以调用请求接收者的相关操作。
ConcreteCommand(具体命令类):具体命令类是抽象命令类的子类,实现了在抽象命令类中声明的方法,它对应具体的接收者对象,绑定接收者对象的动作。在实现execute()方法时,将调用接收者对象的相关操作。
Invoker(调用者):调用者即请求的发送者,又称为请求者,它通过命令对象来执行请求。一个调用者并不需要在设计时确定其接收者,因此它只与抽象命令类之间存在关联关系。在程序运行时将调用具体命令对象的excute()方法,间接调用接收者的相关操作。
Receiver(接收者):接收者执行与请求相关的操作,它具体实现对请求的业务处理.
创建一个抽象命令接口
public interface AbstractCommand {
public void execute();
}
创建一个命令类
package command;
public class Controller {
private AbstractCommand openCommand,closeCommand,changeCommand;
public Controller(AbstractCommand openCommand,AbstractCommand closeCommand,AbstractCommand changeCommand) {
this.openCommand=openCommand;
this.closeCommand=closeCommand;
this.changeCommand=changeCommand;
}
public void open() {
openCommand.execute();
}
public void change() {
changeCommand.execute();
}
public void close() {
closeCommand.execute();
}
}
创建实现了 AbstractCommand 接口的实体类
package command;
public class TVChangeCommand implements AbstractCommand{
private Television tv;
public TVChangeCommand() {
tv=new Television();
}
@Override
public void execute() {
// TODO Auto-generated method stub
tv.changeChannel();
}
}
package command;
public class TVCloseCommand implements AbstractCommand {
private Television tv;
public TVCloseCommand() {
tv=new Television();
}
@Override
public void execute() {
// TODO Auto-generated method stub
tv.close();
}
}
package command;
public class TVOpenCommand implements AbstractCommand {
private Television tv;
public TVOpenCommand() {
tv=new Television();
}
@Override
public void execute() {
// TODO Auto-generated method stub
tv.open();
}
}
执行类
package command;
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
AbstractCommand openCommand,closeCommand,changeCommand;
openCommand=new TVOpenCommand();
closeCommand=new TVCloseCommand();
changeCommand=new TVChangeCommand();
Controller control =new Controller(openCommand,closeCommand,changeCommand);
control.open();
control.change();
control.close();
}
}