- 命令模式的四个角色
- 命令模式的类图
- 命令模式的例子
- 命令模式优点
- 命令模式适用场景
命令模式:将一个请求封装为一个对象,从而使用户可用不同的请求对客户进行参数化,对请求排队或记录请求日志,以及支持可撤销的 *** 作
命令模式的四个角色四种角色:接收者(Receiver),命令(Command)接口,具体命令(ConcreteCommand),请求者(Invoker)
命令模式的类图 命令模式的例子实例:
在军队作战中,指挥官请求三连偷袭敌人,但是指挥官不希望或无法直接与三连取得联系,那么可以将该请求:“三连偷袭敌人”形成一个“作战命令”。只要能让该作战命令被执行,就会实现三连偷袭敌人的目的。
1.接收者(Receiver) : CompanyArmy.java
public class CompanyArmy{
public void sneakAttack(){
System.out.println("我们知道如何偷袭敌人,保证完成任务");
}
}
2.命令(Command)接口 : Command.java
public interface Command {
public abstract void execute();
}
3.具体命令(ConcreteCommand)ConcreteCommand.java
public class ConcreteCommand implements Command{
CompanyArmy army; //含有接收者的引用
ConcreteCommand(CompanyArmy army){
this.army=army;}
public void execute(){ //封装着指挥官的请求
army.sneakAttack(); //偷袭敌人
}
}
4.请求者(Invoker) ArmySuperior.java
public class ArmySuperior{
Command command; //用来存放具体命令的引用
public void setCommand(Command command){
this.command=command;}
public void startExecuteCommand(){
//让具体命令执行execute()方法
command.execute();}}
5.应用 Application.java
public class Application{
public static void main(String args[]){
CompanyArmy 三连=new CompanyArmy();
Command command=new ConcreteCommand(三连);
ArmySuperior 指挥官=new ArmySuperior();
指挥官.setCommand(command);
指挥官.startExecuteCommand();}}
练习:
模拟带控制开关的小电器。该电器上有四个开关,两个一组,其中一组负责打开、关闭小电器上的照明灯,另一组负责打开、关闭小电器上的摄像头。
1.接收者
public class Light {
public void on(){
System.out.println("灯打开了");
}
public void off(){
System.out.println("灯关闭了");
}
}
public class Camera {
public void on(){
System.out.println("摄像头打开了");
}
public void off(){
System.out.println("摄像头关闭了");
}
}
2.命令接口
public interface Command {
public abstract void execute();
public String getName();
}
3.具体命令
public class OffCameraCommand implements shiyan1.Command {
Camera camera;
public OffCameraCommand(Camera camera){
this.camera=camera;
}
public void execute(){
camera.off();
}
public String getName(){
return "关摄像头";
}
}
public class OnCameraCommand implements shiyan1.Command {
Camera camera;
public OnCameraCommand(Camera camera){
this.camera=camera;
}
public void execute(){
camera.on();
}
public String getName(){
return "开摄像头";
}
}
public class OffLightCommand implements shiyan1.Command {
Light light;
public OffLightCommand(Light light){
this.light=light;
}
public void execute(){
light.off();
}
public String getName(){
return "关灯";
}
}
public class OnLightCommand implements shiyan1.Command {
Light light;
public OnLightCommand(Light light){
this.light=light;
}
public void execute(){
light.on();
}
public String getName(){
return "开灯";
}
}
4.请求者
public class invoker {
Command command;
public void setCommand(Command command){
this.command=command;
this.executeCommand();
}
private void executeCommand(){
command.execute();
}
}
5.实现
public class Application {
public static void main(String[] args) {
// TODO Auto-generated method stub
Light light=new Light();
Camera camera=new Camera();
invoker invoker=new invoker();
//开灯
Command command1=new OnLightCommand(light);
invoker.setCommand(command1);
//关灯
Command command2=new OffLightCommand(light);
invoker.setCommand(command2);
//开摄像头
Command command3=new OnCameraCommand(camera);
invoker.setCommand(command3);
//关摄像头
Command command4=new OffCameraCommand(camera);
invoker.setCommand(command4);
}
}
6.运行结果
1、在命令模式中,请求者(Invoker)不直接与接收者(Receiver)交互,即请求者(Invoker)不包含接收者(Receiver)的引用,因此彻底消除了彼此之间的耦合。
2、命令模式满足“开-闭原则”。如果增加新的具体命令和该命令的接受者,不必修改调用者的代码,调用者就可以使用新的命令对象;反之,如果增加新的调用者,不必修改现有的具体命令和接受者,新增加的调用者就可以使用已有的具体命令。
3、由于请求者的请求被封装到了具体命令中,那么就可以将具体命令保存到持久化的媒介中,在需要的时候,重新执行这个具体命令。因此,使用命令模式可以记录日志。
4、使用命令模式可以对请求者的“请求”进行排队。每个请求都各自对应一个具体命令,因此可以按一定顺序执行这些具体命令。
程序需要在不同的时刻指定、排列和执行请求;
程序需要提供撤销 *** 作;
程序需要支持宏 *** 作。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)