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

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

    我们经常出去吃饭,有时候碰见路边摊,我们直接可以和老板说我们要点什么东西,下面为实现代码

    厨师类

    public class Cook {
    
        public void cookChicken(){
            System.out.println("制作红烧鸡!");
        }
    
        public void cookRice(){
            System.out.println("制作米饭!");
        }
    }

    测试类

    public class Test {
        public static void main(String[] args) {
            Cook cook = new Cook();
            cook.cookChicken();
            cook.cookChicken();
            cook.cookRice();
        }
    }

    测试结果:

    制作红烧鸡!
    制作红烧鸡!
    制作米饭!

      可以看到,消费者和厨师是紧耦合的,如果消费者增多,那么订单也就越来越多,厨师就可能记不住那多么订单,并且也有可能记错,而且顾客也不应该关注厨师的制作流程,所以我们从日常生活中可以看到,稍微大一些的饭店都会有服务员来记录每桌的订单,从而使顾客和厨师松耦合,让厨师专注自己的事——料理。下面为增加服务员的代码:

    //厨师
    public class Cook {
    
        public void cookChicken(){
            System.out.println("制作红烧鸡!");
        }
    
        public void cookRice(){
            System.out.println("制作米饭!");
        }
    }
    //命令接口
    public interface Command {
        void executeCommand();
    }
    //制作烧鸡的命令
    public class CookChickenCommand implements Command {
    
        private Cook cook;
    
        public CookChickenCommand(Cook cook){
            this.cook = cook;
        }
        @Override
        public void executeCommand() {
            cook.cookChicken();
        }
    }
    //制作米饭的命令
    public class CookRiceCommand implements Command {
    
        private Cook cook;
    
        public CookRiceCommand(Cook cook){
            this.cook = cook;
        }
        @Override
        public void executeCommand() {
            cook.cookRice();
        }
    }
    //服务员类
    public class Waiter {
    
        //订单
        List<Command> commandList = new ArrayList<>();
    
        //添加订单
        public void setOrder(Command command){
            commandList.add(command);
        }
    
        //取消订单
        public void cancelOrder(Command command){
            commandList.remove(command);
        }
    
        //通知厨师
        public void Notify(){
            for(Command command:commandList){
                command.executeCommand();
            }
        }
    }

    测试类

    public class Test {
        public static void main(String[] args) {
            Cook cook = new Cook();
            CookChickenCommand cookChickenCommand1 = new CookChickenCommand(cook);
            CookChickenCommand cookChickenCommand2 = new CookChickenCommand(cook);
            CookRiceCommand cookRiceCommand = new CookRiceCommand(cook);
    
            Waiter waiter = new Waiter();
            waiter.setOrder(cookChickenCommand1);
            waiter.setOrder(cookChickenCommand2);
            waiter.setOrder(cookRiceCommand);
            waiter.Notify();
    
        }
    }

    测试结果:

    制作红烧鸡!
    制作红烧鸡!
    制作米饭!

    可以看到我们首先定义了命令接口,有两个实现方法,通过他们去通知厨师该做什么菜,然后定义了一个服务员,用来整理订单,有订单的添加和取消两个方法,订单完成后,又服务员通知厨师,发出制作的命令。

    命令模式的优点:

    1.通过服务员的setOrder()和cancelOrder()我们可以很容易实现队请求的发起,撤销。

    2.通过服务员的setOrder()和cancelOrder()我们可以很容易的在命令发生变化时记录变化的日志。

    3.可以很容易的添加新的命令类型,并且不影响其他的类。

  • 相关阅读:
    jQuery瀑布流实例无限滚动加载图片
    【转载】IEnumerable<T>和IQueryable<T>区分
    【转载】C#数组,List,Dictionary的相互转换
    【转载】IQueryable和IEnumerable
    【转载】ABP源码分析一:整体项目结构及目录
    【转载】.NET深入解析LINQ框架(四:IQueryable、IQueryProvider接口详解)
    C# DataTable 转换 Model实体类,DataTable 转换 List 集合
    【转载】N 种仅仅使用 HTML/CSS 实现各类进度条的方式
    【转载】IQueryable 和 IEnumerable 的区别
    【转载】SQL Server Profiler工具
  • 原文地址:https://www.cnblogs.com/yimengyizhen/p/11297626.html
Copyright © 2011-2022 走看看