zoukankan      html  css  js  c++  java
  • 第二十三章 命令模式

    命令模式(Command):将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。

    优点:1、它能较容易的设计一个命令队列;2、在需要的情况下,可以较容易的将命令记入日志;3、允许接收请求的一方决定是否要否决请求;4、可以容易的实现对请求的撤销和重做;5、由于加入新的具体命令类不影响其它的类,因此增加新的具体命令类很容易。6、命令模式把请求一个操作的对象与知道怎么执行一个操作的对象分割开。

    场景:在需要对请求操作支持撤销/恢复功能时。

    /**
     * Created by hero on 16-4-7.
     */
    public abstract class Command {
        protected Barbecuer receiver;
    
        public abstract void excuteCommand();
    
        public Command(Barbecuer receiver) {
            this.receiver = receiver;
        }
    }
    /**
     * Created by hero on 16-4-7.
     */
    public class BakeChickenWingCommand extends Command {
        @Override
        public void excuteCommand() {
            receiver.bakeChickenWing();
        }
    
        public BakeChickenWingCommand(Barbecuer receiver) {
            super(receiver);
        }
    }
    /**
     * Created by hero on 16-4-7.
     */
    public class BakeMuttonCommand extends Command {
        @Override
        public void excuteCommand() {
            receiver.bakeMutton();
        }
    
        public BakeMuttonCommand(Barbecuer receiver) {
            super(receiver);
        }
    }
    /**
     * Created by hero on 16-4-7.
     */
    public class Barbecuer {
        public void bakeMutton() {
            System.out.println("烤羊肉串");
        }
    
        public void bakeChickenWing() {
            System.out.println("烤鸡翅");
        }
    }
    import java.util.LinkedList;
    import java.util.List;
    
    /**
     * Created by hero on 16-4-7.
     */
    public class Waitress {
        private List<Command> orders = new LinkedList<>();
    
        public void setOrders(Command command) {
            //在此处可以拒绝某些command,当执行该command未满足条件时 TODO
            orders.add(command);
        }
    
        public void cancleOrder(Command command) {
            orders.remove(command);
        }
    
        public void notifyCook() {
            for (Command c : orders) {
                c.excuteCommand();
            }
        }
    }
    public class Main {
    
        public static void main(String[] args) {
            Barbecuer cook = new Barbecuer();
            BakeChickenWingCommand c1 = new BakeChickenWingCommand(cook);
            BakeMuttonCommand c2 = new BakeMuttonCommand(cook);
            Waitress waitress = new Waitress();
            waitress.setOrders(c1);
            waitress.setOrders(c2);
            waitress.notifyCook();
        }
    }
  • 相关阅读:
    git常用操作命令
    如何编写高质量代码
    Chrome调试工具简单介绍
    使用eclipse+tomcat搭建本地环境
    chrome设置--disable-web-security解决跨域
    利用Maven管理工程项目本地启动报错及解决方案
    用户输入验证【提升篇】
    简单【用户输入验证】
    【消息框】的返回值
    【消息框】的4种显示形式
  • 原文地址:https://www.cnblogs.com/littlehoom/p/5365856.html
Copyright © 2011-2022 走看看