命名模式将请求发送者与请求接收者解耦,请求发送者通过命令对象来间接引用接收者,使得系统有更好的灵活性,可以在不修改现有的系统源代码的情况下让相同的发生者对应不同的接收者。相当与开关与电器的关系(空调、电风扇等等)
命令模式:将一个请求封装为一个对象,从而让你可以用不同的额请求对客户端进行参数化,对请求排队或者记录请求日志,以及支持可撤销的操作。
命令模式有4种角色:
1.Command(抽象命令类):抽象命令类一般是抽象类和接口,在其中声明了用于执行的Execute()等方法,通过这些可以调用请求接收者的相关操作。
2.ConcreteCommand(具体命令类):它抽象命令类的子类,将接收者对象的动作绑定在其中,具体命令类在实现Execute()方法,将调用接收者对象的相关操作(Action)
3.Invoker(调用者):调用者即请求发送者,它通过命令对象来执行请求。
4.Receiver(接收者):接收者执行与请求相关的操作,具体实现对请求的业务处理。
抽象命令类: abstract class Command { public abstract void Execute(); }
具体命令类: class ConcreteCommand:Command { private Receiver receiver; //维持一个对请求接收者对象的引用 public override void Execute() { receiver.Action(); //调用请求接收者的业务处理方法Action() } }
请求接收者: class Receiver { public void Action() { //具体操作 } }
调用者: class Invoker { private Command command; //构造注入 public Invoker(Command command) { this.commmand = command; } public Command Command { get{return command;} set(command = value;} } //业务方法,用于调用命令类的方法 public void Call() { command.Execute(); } }