命令模式是一个数据驱动式的设计模式,隶属于行为模式类别。将请求作为命令包装在对象中,然后传递给调用者对象。
调用者对象查找处理此命令的适当对象,并将命令传递到执行命令的相应对象。
我认为理解设计模式最主要是掌握其原理构造,这样才对自己实际编程有指导作用。
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();
}
}
参考自:
https://www.tutorialspoint.com/design_pattern/command_pattern.htm
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
转载请注明原文地址: https://ju.6miu.com/read-700338.html