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.可以很容易的添加新的命令类型,并且不影响其他的类。

  • 相关阅读:
    浅析Vue3相关基础知识:Vue3应用配置、重写的vmodel、emits 选项、getCurrentInstance()获取实例、采用mitt实现全局通讯、vuerouter的新特性
    Vue3结合TS项目开发实践:Composition API的风格理念、关注点分离、如何组织TS进行项目开发(采用声明文件来管理接口及所需类型/目录结构推荐)
    TypeScript类型守卫、联合类型、交叉类型
    Android开发历程_14(广播机制)
    OpenGL_Qt学习笔记之_03(平面图形的着色和旋转)
    OpenGL_Qt学习笔记之_06(纹理滤波、光照和色彩融合)
    Qt学习之路_12(简易数据管理系统)
    特征点检测学习_2(surf算法)
    Kinect+OpenNI学习笔记之2(获取kinect的颜色图像和深度图像)
    PCA算法学习_1(OpenCV中PCA实现人脸降维)
  • 原文地址:https://www.cnblogs.com/yimengyizhen/p/11297626.html
Copyright © 2011-2022 走看看