命令模式(Command Pattern):将一个请求封装为一个对象,从而让咱们可用不一样的请求对客户进行参数化;对请求排队或者记录请求日志,以及支持可撤销的操做。命令模式是一种对象行为型模式,其别名为动做(Action)模式或事务(Transaction)模式。java
以下,是命令模式的结构图,其中设计模式
excute()
方法。简单来讲,就是为了解耦。设计模式在建立之初就是为了知足软件开发的灵活性。命令模式的初衷就是将命令调用者和命令接收者解耦开。this
下面经过几段Java代码来简单了解下命令模式的具体实现:spa
抽象命令类设计
/** * 抽象命令类 */ public interface Command { void execute(); }
具体命令类日志
package com.cn.design_pattern.command_pattern; /** * 具体命令类 * * 能够有多个,须要实现Command接口 * */ public class ConcreteCommandA implements Command { /* * 须要持有一个执行者 */ private Receiver receiver; public ConcreteCommandA(Receiver receiver) { this.receiver = receiver; } /* * 重写本身的命令执行方法,在方法中,须要经过持有的接收者对象,来调用接收者方法 */ public void execute() { System.out.println("命令:" + getClass().getSimpleName() + "已经交给接收者:" + this.receiver.getClass().getSimpleName() + "执行了!"); receiver.DoA(); } }
package com.cn.design_pattern.command_pattern; public class ConcreteCommandB implements Command { /* * 须要持有一个执行者 */ private Receiver receiver; public ConcreteCommandB(Receiver receiver) { this.receiver = receiver; } /* * 重写本身的命令执行方法,在方法中,须要经过持有的接收者对象,来调用接收者方法 */ public void execute() { System.out.println("命令:" + getClass().getSimpleName() + "已经交给接收者:" + this.receiver.getClass().getSimpleName() + "执行了!"); receiver.DoB(); } }
接收者code
package com.cn.design_pattern.command_pattern; /** * 具体接收者 * */ public class Receiver { public void DoA() { System.out.println("接收者执行了命令A"); } public void DoB() { System.out.println("接收者执行了命令B"); } }
调用者对象
package com.cn.design_pattern.command_pattern; /** * 调用者/请求者 * */ public class Invoker { /* * 持有一个抽象命令对象 */ private Command command; public Invoker(Command command) { this.command = command; } public void setCommand(Command command) { this.command = command; } /* * 调用者发起调用 */ public void Call() { command.execute(); } }
main方法blog
package com.cn.design_pattern.command_pattern; public class Main { public static void main(String[] args) { Receiver receiver = new Receiver(); Command commandA = new ConcreteCommandA(receiver); Invoker invokerA = new Invoker(commandA); invokerA.Call(); Command commandB = new ConcreteCommandB(receiver); Invoker invokerB = new Invoker(commandB); invokerB.Call(); } }
执行结果接口
命令:ConcreteCommandA已经交给执行者:Receiver执行了! 执行者执行了命令A 命令:ConcreteCommandB已经交给执行者:Receiver执行了! 执行者执行了命令B