命令模式
定义:
将请求、命令、动作等封装成对象,这样可以让项目使用这些对象来参数化其他对象。是的命令的请求者和执行者解耦
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); } }
浙公网安备 33010602011771号