设计模式----命令模式

命令模式是一个数据驱动式的设计模式,隶属于行为模式类别。将请求作为命令包装在对象中,然后传递给调用者对象。

调用者对象查找处理此命令的适当对象,并将命令传递到执行命令的相应对象。

我认为理解设计模式最主要是掌握其原理构造,这样才对自己实际编程有指导作用。

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
Keep it simple!
作者:N3verL4nd
知识共享,欢迎转载。
原文地址:https://www.cnblogs.com/lgh1992314/p/6616298.html