命令模式

定义:

将请求、命令、动作等封装成对象,这样可以让项目使用这些对象来参数化其他对象。是的命令的请求者和执行者解耦

UML图:

从类图看,调用者(Invoker)内部封装了各个接收者(Receiver)封装好动作的对象(command),这样调用者只关心内部设置的这些Command,而接收站只需要向调用者提供Command,达到两者的解耦,同时统一了接口。

代码实现:

定义Receiver,动作的真正执行者,一般为不同的api,设备等,一般人说道命令模式,大部分会以遥控器遥控设备做例子,这个对象就是各种设备的对象。

public class ReceiverA {
    public void SayHi(){
        System.out.println("Hi,I'm A");
    }

}


public class ReceiverB {
    public void SayHello(){
        System.out.println("Hello,I'm B!");
    }

}

定义Command,就是将设备执行的动作封装成统一父类(或接口)对象,面向接口编程。以便提供给命令的发出者使用

public interface ICommand {
    public void execute();
    public void undo();

}

public class CommandA implements ICommand{
    public ReceiverA a;
    public void setA(ReceiverA a){
        this.a=a;
    }

    public void execute() {
        a.SayHi();        
    }

    public void undo() {
    }

}

public class CommandB implements ICommand{
    public ReceiverB b;
    public void setA(ReceiverB b){
        this.b=b;
    }

    public void execute() {
       b.SayHello();
    }

    public void undo() {
    }

}

命令发起者,就是上面例子中的遥控器。

public class Invoker {
    public ICommand[] CommandArray = new ICommand[2];

    public void setCommand(int i, ICommand command) {
        if (i > 2 || i < 1) {
            return;
        }
        CommandArray[i - 1] = command;

    }

    public void action(int i) {
        if (i > 2 || i < 1) {
            return;
        }
        CommandArray[i - 1].execute();
    }

}

主函数:

public class Client {
    public static void main(String[] args) {
        //初始化执行者
        ReceiverA A=new ReceiverA();
        ReceiverB B=new ReceiverB();
        //初始化命令对象
        CommandA Ca=new CommandA();
        CommandB Cb=new CommandB();
        Ca.setA(A);
        Cb.setA(B);
        //初始化命令发送者
        Invoker invoker=new Invoker();
        invoker.setCommand(1, Ca);
        invoker.setCommand(2, Cb);
        //执行指令
        invoker.action(1);
        invoker.action(2);


    }

}

 

posted @ 2017-05-09 16:09  葡萄树上有葡萄  阅读(136)  评论(0)    收藏  举报