zoukankan      html  css  js  c++  java
  • 设计模式----命令模式

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

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

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

    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
    知识共享,欢迎转载。
  • 相关阅读:
    修改其他输入法为android 默认输入法
    {php 数据类型}
    转:PHP.ini配置文件(中文)
    php导出任意mysql数据库中的表去excel文件
    php输出、写入csv
    smarty二级分类代码和模版循环例子
    笔记:使ecshop 模板中可引用 常量
    Windows下Apache2不同域名解析不同目录解决方法
    {php 数组}
    Apache中.htaccess文件功能
  • 原文地址:https://www.cnblogs.com/lgh1992314/p/6616298.html
Copyright © 2011-2022 走看看