e2

滴滴侠,fai抖

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

命令接收者类:

package command_mode;

/**
 * 命令接收者类(业务对象)
 */
public class Receiver {

    
    /**
     * 业务方法(由命令类调用)
     */
    public void action(){
        System.out.println("Receiver.action()");
    }
    
}

 

命令接口:

package command_mode;

/**
 * 命令接口
 */
public interface Command {

    /**
     * 执行方法
     */
    public void execute();
    
}

 

具体命令类:

package command_mode;

/**
 * 具体命令类
 */
public class ConcreteCommand implements Command{

    
    /**
     * 命令接收者(真正命令执行者)
     */
    private Receiver receiver;
    
    
    /**
     * 具体命令类构造器, 传入命令接收者, 对它进行调用
     */
    public ConcreteCommand(Receiver receiver){
        this.receiver = receiver;
    }
    
    
    /**
     * 具体命令类的执行方法
     * 此方法为返回结果为空, 参数为空的方法.
     * 实际项目中, 可以根据需求, 设计任何返回类型和参数, 并且可多个不同的方法
     */
    @Override
    public void execute() {
        //可以做些日志统计等其它操作
        //do..
        receiver.action();
        //do..
    }
    
}

 

调用者:

package command_mode;

/**
 * 调用者(发起者)
 * 调用命令
 */
public class Invoke {

    
    /**
     * 调用者当前拥有的具体命令类
     */
    private Command command;//也可以通过容器List<Command>容纳很多命令对象,进行批处理.数据库底层的事务管理就是类似的结构!
    
    
    /**
     * 调用者构造器
     */
    public Invoke(){
    }
    
    
    /**
     * 调用者构造器, 传入具体命令对象
     */
    public Invoke(Command command){
        this.command = command;
    }
    
    
    /**
     * 运行时可以动态的持有其它具体命令对象
     */
    public void setCommand(Command command) {
        this.command = command;
    }
    
    
    /**
     * 调用者的执行方法, 用于调用具体命令对象的执行方法
     */
    public void call(){
        //可以做些过滤等其它操作
        //do..
        command.execute();//如果是多条命令, 可以批处理(循环)
        //do..
    }
    
}

 

测试类:

package command_mode;

public class Client {

    public static void main(String[] args) {
        //创建具体命令类(需要一个接收者)
        Command commandA = new ConcreteCommand(new Receiver());
        Command commandB = new ConcreteCommand(new Receiver());
        //创建调用者, 并测试两个命令
        Invoke invoke = new Invoke();
        invoke.setCommand(commandA);
        invoke.call();
        
        invoke.setCommand(commandB);
        invoke.call();
        
        
        //也可以直接调用, 但无法处理更复杂的情况, 没有扩展和灵活性. 然而以上可以适应各种各样的变化
        //new Receiver().action();
    }
    
}

 

执行结果:

Receiver.action()
Receiver.action()

 

 

谢谢声明出处!

转自: http://www.cnblogs.com/gscq073240/articles/7105851.html

 

posted on 2017-07-02 13:51  纯黑Se丶  阅读(136)  评论(0)    收藏  举报