命令模式是一个数据驱动式的设计模式,隶属于行为模式类别。将请求作为命令包装在对象中,然后传递给调用者对象。
调用者对象查找处理此命令的适当对象,并将命令传递到执行命令的相应对象。
我认为理解设计模式最主要是掌握其原理构造,这样才对自己实际编程有指导作用。
Command模式实际上不是个很具体,规定很多的模式,正是这个灵活性,让人有些confused。
四人帮对命令模式的概括:Encapsulate a request as an object, therebyletting you parameterizeclients with different requests, queue or log requests,and support undoable operations.(命令模式将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象,同时支持可撤消的操作)。
可以这样理解:将一组行为抽象为对象,这个对象和其他对象一样可以被存储和传递,从而实现行为请求者与行为实现者之间的松耦合,这就是命令模式。
Commands are an object-oriented replacement for callbacks.(命令模式是回调机制的面向对象版本)。
这句话从另一个方面道出了命令模式的思想,它是回调的面向对象版本。
实现
(1)抽象命令角色(Command):抽象命令,包含命令执行的抽象方法(2)命令接收者(Stock):命令接收者角色,它包含所有命令的具体行为实现方法。
(3)具体命令角色(BuyCommand/SellCommand):它包含一个命令接收者对象,并调用接收者的对象相应实现方法。
(4)命令调用者角色(Invoker):提供给客户端调用,接收客户端所传递的具体命令对象。
其实命令模式的结构还是比较清晰的,总的来说命令模式的使用流程就是首先创建一个抽象命令,然后创建多个具体命令实现抽象命令接口,然后创建一个命令接受者角色,它包含各种的行为的具体实现,然后再有一个命令调用者角色,提供给客户端,用于接收客户端的参数。
import java.util.ArrayList; import java.util.List; /** * Created by N3verL4nd on 2016/11/14. */ interface Command { void execute(); } class Stock { private String name = "lgh"; private int quantity = 100; public void buy(){ System.out.println("Stock [ Name: "+name+", Quantity: " + quantity +" ] bought"); } public void sell(){ System.out.println("Stock [ Name: "+name+", Quantity: " + quantity +" ] sold"); } } class BuyCommand implements Command { private Stock stock; public BuyCommand(Stock stock){ this.stock = stock; } public void execute() { stock.buy(); } } class SellCommand implements Command { private Stock stock; public SellCommand(Stock stock){ this.stock = stock; } public void execute() { stock.sell(); } } class Invoker { private List<Command> commandList = new ArrayList<Command>(); public void takeCommand(Command order){ commandList.add(order); } public void placeCommands(){ for (Command command : commandList) { command.execute(); } commandList.clear(); } } public class pattern { public static void main(String[] args) { Stock abcStock = new Stock(); BuyCommand buyCommand = new BuyCommand(abcStock); SellCommand sellCommand = new SellCommand(abcStock); Invoker invoker = new Invoker(); invoker.takeCommand(buyCommand); invoker.takeCommand(sellCommand); invoker.placeCommands(); } }
http://wiki.jikexueyuan.com/project/java-design-pattern/command-pattern.html
http://bolaven.blog.51cto.com/8639884/1368935
http://www.oodesign.com/command-pattern.html
https://sourcemaking.com/design_patterns/command
https://zhuanlan.zhihu.com/p/22620827
http://www.cnblogs.com/kid-li/archive/2006/11/18/564852.html
http://www.cnblogs.com/java-my-life/archive/2012/06/01/2526972.html