定义
将一个请求封装成一个对象,从而让你使用不同的请求参数把客户端参数化,对请求排队或者记录日志请求,可以提供对命令的撤销和恢复模式。
模板方法模式的角色
1:命令角色(Command)
该角色声明一个给所有具体命令类的抽象接口,定义需要执行的命令。
public interface Command{ public void execute();}
2:具体命令(Concrete Command)
该角色定义一个接受者额行为之间的弱耦合,实现命令方法,并调用接受者的相应操作。
public class ConcreteCommand implements Command{ private Receiver reveicer; public ConcreteCommand(Receiver receiver){ this.reveicer = receiver; } public void execute(){ this.receiver.action(); } }
3:调用者角色(Invoker)
该角色负责调用命令对象执行请求。
public class Invoker{ private Command command; public void setCommand(Command command){ this.command = command; } public void action(){ this.command.action(); }}
4:接受者角色(Receiver)
该角色负责具体实施和执行一个请求。
public class Receiver{ public void action(){ System.out.println("执行动作!"); }}
客户端代码:
public class Client{ public static void main(String[] args){ Invoker invoker = new Invoker(); invoker.setCommand(new ConcreateCommand(new Receiver())); invoker.action(); }}
优点
1:类之间解耦,调用者和接收者之间没有依赖关系
2:可扩展性,Comand的子类可以非常容易的扩展。
3:命令模式可以和其他好多模式相结合使用(责任链模式、模板方法模式)
缺点
使用命令模式容易导致系统中出现过多的具体命令类。
使用场景
1:使用命令模式作为回调,在面向对象系统中的替代。
2:需要在不同的事件指定请求,将请求排队。
3:系统需要支持命令的撤销。
4:一个系统需要支持交易的,可以扩展多个交易类型。
参考资料:设计模式(java)
文章转载于:https://www.jianshu.com/p/930cfec22d33
原著是一个有趣的人,若有侵权,请通知删除
还没有人抢沙发呢~