zoukankan      html  css  js  c++  java
  • Java设计模式----命令模式(Command)

    1. 命令模式是一个高内聚的模式,其定义为: 将一个请求封装成一个对象,从而让你用不同的请求把客户端参数化,对请求排队或记录请求日志,可以提供命令的撤销和恢复功能。

    2.  命令模式中的3个角色

         a、 Receiver 接受者或执行者角色

         该角色是处理具体业务的角色,命令传递到这里是应该被执行的。

         b、 Command 命令角色

         需要执行的所有命令都在这里声明。

         c、 Invoker 调用者角色 

    3.  命令模式的封装性非常好,把请求角色(Receiver)和调用者(Invoker)角色分开了,扩展性也有很好的保证,通用代码如下;

    抽象的Receiver类:

    /**
     * 抽象命令处理者
     * @author zqkj001
     *
     */
    public abstract class Receiver {
       
    	public abstract void  doSomething();
    	
    }
    具体的Receiver角色类

    /**
     * 具体命令处理者
     * @author zqkj001
     *
     */
    public class ConcreteReceiver1 extends Receiver {
    
    	@Override
    	public void doSomething() {
    		
    		System.out.println("处理事务1...");
    
    	}
    
    }
    抽象的Command类

    /**
     * 抽象命令类
     * @author zqkj001
     *
     */
    public abstract class Command {
        
    	//定义一个子类共享的全局成员变量
    	protected final Receiver receiver;
    	
    	public Command(Receiver re) {
    		this.receiver=re;
    	}
    	
    	public abstract void execute();
    }
    具体的Command角色类

    /**
     * 具体命令类
     * @author zqkj001
     *
     */
    public class ConcreteCommand1 extends Command {
        
    	//设置新的命令处理者
    	public ConcreteCommand1(Receiver re) {
    		super(re);
    	}
    	
    	//设置默认的命令处理者
    	public ConcreteCommand1() {
    		super(new ConcreteReceiver1());
    	}
    
    	@Override
    	public void execute() {
    		
    		super.receiver.doSomething();
    
    	}
    
    }
    调用者角色类

    /**
     * 调用者类
     * @author zqkj001
     *
     */
    public class Invoker {
        
    	private Command command;
    	
    	public void setCommand(Command com) {
    		this.command=com;
    	}
    	
    	//执行命令
    	public void  action(){
    		this.command.execute();
    	}
    }
    客户端类(测试类):

    public class Test {
       
    	public static void main(String[] args) {
    		
    		//定义一条发送给处理者的命令
    		Command command=new ConcreteCommand1();
    		//定义一个调用者(调用者接受所有的命令)
    		Invoker invoker=new Invoker();
    		//把命令交给调用者执行
    		invoker.setCommand(command);
    		
    		invoker.action();
    		
    	}
    }
    4.  命令模式的优点

    ● 类间解耦

    调用者角色与接收者角色之间没有任何依赖关系,调用者实现功能时只需调用Command抽象类的execute方法就可以,不需要了解到底是哪个接收者执行。

    ● 可扩展性

    Command的子类可以非常容易地扩展,而调用者Invoker和高层次的模块Client不产生严重的代码耦合。

    ● 命令模式结合其他模式会更优秀

    命令模式可以结合责任链模式,实现命令族解析任务;结合模板方法模式,则可以减少Command子类的膨胀问题。

    5.  本例的代码类图








  • 相关阅读:
    单例模式
    pandas to_html
    restful
    numpy版本查看以及升降
    视频下载
    转载:caffe中的Reshape层
    caffe编译报错解决
    python 版Faster Rcnn
    转载:动态规划以及路径记录
    TensorFlow设置GPU占用量
  • 原文地址:https://www.cnblogs.com/elgin-seth/p/5293756.html
Copyright © 2011-2022 走看看