精华内容
下载资源
问答
  • 初学 Java 设计模式(十五):实战命令模式 「扫码点餐
    2021-04-24 21:18:26

    一、命令模式介绍

    1. 解决的问题

    主要解决在系统中,行为请求者和行为实现者紧耦合的问题。

    2. 定义

    命令模式是一种行为设计模式,它可将请求转换为一个包含与请求相关的所有信息的独立对象。这个转换会根据不同的请求将方法参数化、延迟请求执行或将其放入队列中,且能实现可撤销操作。

    3. 应用场景

    • 需要通过操作来参数化对象,可使用命令模式。
    • 将操作放入队列中、延迟操作的执行或者远程执行操作,可使用命令模式。
    • 实现操作回滚功能,可使用命令模式。

    二、命令模式优缺点

    1. 优点

    • 单一职责原则:可以解耦触发和执行操作的类。
    • 开闭原则:可以在不修改已有客户端代码的情况下,在程序中创建新的命令
    • 可以实行撤销和恢复功能。
    • 可以实现操作的延迟执行。
    • 可以将一组简单命令组合成一个复杂命令。

    2. 缺点

    • 代码可能会变得更加复杂,因为在发送者和接收者之间增加了一个全新的层次。

    三、命令模式应用实例:扫码点餐

    1. 实例场景

    今年五一五天假,很多小伙伴可能以及迫不及待地要出去玩了。出去除了看风景以外,最重要的就是体验一下当地的美食。找到心仪的店,当然少不了排队,排队的同时服务员会给一个二维码提前点餐了,当我们选好了想要吃的美食,确定下单,后台系统自动将订单打印给不同的厨师。

    这时,我们的订单就是一个命令,它在厨师制作之前一直在队列中等待。命令包含制作这些美食的所有信息。厨师可以根据这个订单直接制作,不需要和我们确认订单信息。

    今天,我们就以扫码点餐为例,介绍一下命令模式。

    2. 命令模式实现

    2.1 工程结构
    command-pattern
    └─ src
        ├─ main
        │	└─ java
        │    └─ org.design.pattern.command
        │       ├─ model
        │       │    ├─ cook
        │       │    │    ├─ Cook.java
        │       │    │    └─ impl
        │       │    │         ├─ ChiefCook.java
        │       │    │         └─  CustomCook.java
        │       │    └─ dish
        │       │         ├─ Dish.java
        │       │         └─ impl
        │       │              ├─ BraisedIntestines.java
        │       │              ├─ FriedPeanuts.java
        │       │              ├─ LocalPotChicken.java
        │       │              └─ ShreddedCabbage.java
        │       └─ service
        │            └─ OrderService.java
        │                 └─ impl
        │                    └─ OrderServiceImpl.java
        └─ test
        	└─ java
                └─ org.design.pattern.command
          			└─ OrderServiceTest.java
    
    2.2 代码实现
    2.2.1 实体类

    厨师接口

    /**
     * 厨师接口
     */
    public interface Cook {
    
        /**
         * 做饭
         * @param dishName 菜名
         */
        void cooking(String dishName);
    }
    

    主厨实体类

    /**
     * 主厨
     */
    @Slf4j
    public class ChiefCook implements Cook {
    
        /**
         * 做饭
         *
         * @param dishName 菜名
         */
        @Override
        public void cooking(String dishName) {
            log.info("主厨制作{}", dishName);
        }
    }
    
    

    普通厨师实体类

    /**
     * 普通厨师
     */
    @Slf4j
    public class CustomCook implements Cook {
    
        /**
         * 做饭
         *
         * @param dishName 菜名
         */
        @Override
        public void cooking(String dishName) {
            log.info("普通厨师制作{}", dishName);
        }
    }
    

    美食接口

    /**
     * 美食接口
     */
    public abstract class Dish {
    
        /**
         * 厨师
         */
        protected Cook cook;
    
        public Dish(Cook cook) {
            this.cook = cook;
        }
    
        /**
         * 制作
         */
        abstract public void cook();
    }
    

    九转大肠实体类

    /**
     * 九转大肠
     */
    public class BraisedIntestines extends Dish {
    
        public BraisedIntestines(Cook cook) {
            super(cook);
        }
    
        /**
         * 制作
         */
        @Override
        public void cook() {
            this.cook.cooking("九转大肠");
        }
    }
    

    油炸花生米实体类

    /**
     * 油炸花生米
     */
    public class FriedPeanuts extends Dish {
    
        public FriedPeanuts(Cook cook) {
            super(cook);
        }
    
        /**
         * 制作
         */
        @Override
        public void cook() {
            this.cook.cooking("油炸花生米");
        }
    }
    

    地锅鸡实体类

    /**
     * 地锅鸡
     */
    public class LocalPotChicken extends Dish {
    
        public LocalPotChicken(Cook cook) {
            super(cook);
        }
    
        /**
         * 制作
         */
        @Override
        public void cook() {
            this.cook.cooking("地锅鸡");
        }
    }
    

    手撕包菜实体类

    /**
     * 手撕包菜
     */
    public class ShreddedCabbage extends Dish {
    
        public ShreddedCabbage(Cook cook) {
            super(cook);
        }
    
        /**
         * 制作
         */
        @Override
        public void cook() {
            this.cook.cooking("手撕包菜");
        }
    }
    
    2.2.2 服务类

    点餐服务接口

    /**
     * 点餐服务接口
     */
    public interface OrderService {
    
        /**
         * 点菜
         * @param dish 菜
         */
        void order(Dish dish);
    
        /**
         * 下单
         */
        void placeOrder();
    }
    

    点餐服务实现类

    /**
     * 点餐服务实现类
     */
    public class OrderServiceImpl implements OrderService {
    
        private List<Dish> dishList = new ArrayList<>();
    
        /**
         * 点菜
         *
         * @param dish 菜
         */
        @Override
        public void order(Dish dish) {
            dishList.add(dish);
        }
    
        /**
         * 下单
         */
        @Override
        public synchronized void placeOrder() {
            for (Dish dish : dishList) {
                dish.cook();
            }
            dishList.clear();
        }
    }
    
    2.3 测试验证
    2.3.1 测试验证类
    public class OrderServiceTest {
    
        @Test
        public void testPlaceOrder() {
            Cook chiefCook = new ChiefCook();
            Cook customCook = new CustomCook();
            Dish braisedIntestines = new BraisedIntestines(chiefCook);
            Dish localPotChicken = new LocalPotChicken(chiefCook);
            Dish friedPeanuts = new FriedPeanuts(customCook);
            Dish shreddedCabbage = new ShreddedCabbage(customCook);
    
            OrderService orderService = new OrderServiceImpl();
            orderService.order(braisedIntestines);
            orderService.order(localPotChicken);
            orderService.order(friedPeanuts);
            orderService.order(shreddedCabbage);
            orderService.placeOrder();
        }
    }
    
    2.3.2 测试结果
    21:08:41.617 [main] INFO  o.d.p.c.model.cook.impl.ChiefCook - 主厨制作九转大肠
    21:08:41.620 [main] INFO  o.d.p.c.model.cook.impl.ChiefCook - 主厨制作地锅鸡
    21:08:41.620 [main] INFO  o.d.p.c.model.cook.impl.CustomCook - 普通厨师制作油炸花生米
    21:08:41.620 [main] INFO  o.d.p.c.model.cook.impl.CustomCook - 普通厨师制作手撕包菜
    
    Process finished with exit code 0
    

    四、命令模式结构

    在这里插入图片描述

    1. 触发者(Invoker)—— 亦称 “发送者(Sender)”类负责对请求进行初始化,其中必须包含一个成员变量来存储对命令对象的引用。

      发送者触发命令,而不向接收者这集发送请求,且发送者并不负责创建命令对象:通常会通过构造函数从客户端处获取预先生成的命令。

    2. 命令(Command)接口通常仅声明一个执行命令的方法。

    3. 具体命令(Concrete Commands)会实现各种类型的请求。

      具体命令自身并不完成工作,而是会将调用委派给一个业务逻辑对象,当然为了简化代码,也合并该对象。

      接收对象执行方法所需的参数可声明为具体命令的成员对象,同时可以将命令对象设为不可变,仅允许通过构造早函数来对这些成员变量进行初始化。

    4. 接收者(Receiver)类包含部分业务逻辑。

      基本上,任何对象都可以作为接收者。绝大部分命令只处理如何将请求传递给接收者的细节,接收者自行完成实际的工作。

    5. 客户端(Client)会创建并配置具体命令对象。

      客户端必须将接收者实体在内的所有请求参数传递给命令的构造函数,之后,生成的命令就可以与一个或多个发送者相关联。

    设计模式并不难学,其本身就是多年经验提炼出的开发指导思想,关键在于多加练习,带着使用设计模式的思想去优化代码,就能构建出更合理的代码。

    源码地址:https://github.com/yiyufxst/design-pattern-java

    参考资料:
    小博哥重学设计模式:https://github.com/fuzhengwei/itstack-demo-design
    深入设计模式:https://refactoringguru.cn/design-patterns/catalog

    更多相关内容
  • 扫码点餐源代码.zip

    2020-01-16 16:27:12
    扫码点餐源代码.zip【微信】公众号扫码点餐功能(附代码) 最近在做一个需求,也是公众号常用的功能-《扫码点餐》。 在店铺桌子贴一张固定二维码,用户扫码后进入公众号窗口①,推送模板消息(点餐消息)给用户②...
  • 前端:Uniapp 开发 后端:JAVA 数据库:MySQL 源码类型:WinForm

    前端:Uniapp 开发

    后端:JAVA

    数据库:MySQL

    源码类型:WinForm

    后台管理功能:

    1、 财务统计

    2、 堂食订单

     

    3、 外卖订单

     

    4、 预约订单

     

    5、 充值订单

    6、 排队取号

     

    7、 预约桌位

    8、 菜品管理

    9、 门店管理

    10、 订单满减

    11、 管理中心

    12、 会员管理

    13、 员工管理

    展开全文
  • 扫码点餐源代码.zip 公众号扫码点餐功能(附代码) 最近在做一个需求,也是公众号常用的功能-《扫码点餐》。 在店铺桌子贴一张固定二维码,用户扫码后进入公众号窗口①,推送模板消息(点餐消息)给用户②。 ① 用户...
  • 微信小程序的扫码点餐系统,后台使用若依开源框架。
  • 使用java语言开发的微信扫码点餐系统,支持微信、余额支付。小程序页面可以在后台中自定义配置。 使用java语言开发的微信扫码点餐系统,支持微信、余额支付。小程序页面可以在后台中自定义配置。 使用java语言...
  • 外卖扫码点餐全开源小程序源码【价值2400元】.rar+前端+后端全代码
  • 微信扫码点餐源码,实现了扫二维码点餐,外卖,查询点单
  • 测试过、有些小问题、具体可以下载测试。智慧点餐扫码点餐小程序系统
  • springboot mybatis,微信小程序,Java后台
  • 微信点餐系统JAVA源码 花大价钱弄来的 微信公众平台 在线点餐
  • Java点餐系统+扫码点餐小程序部署文档(2020版)

    千次阅读 热门讨论 2020-03-14 11:32:01
    3,安装IntelliJ IDEA 开发工具(java) 4,安装微信小程序开发者工具 5,注册小程序获取小程序appid java后台 一,源码导入 1,首先下载源码 上图中的Java后台源码,下载到桌面并解压 2,点击open导入上图的java...

    准备工作

    • 1,安装jdk8或者jdk11
    • 2,安装mysql8.0
    • 3,安装IntelliJ IDEA 开发工具(java)
    • 4,安装微信小程序开发者工具
    • 5,注册小程序获取小程序appid

    java后台

    一,源码导入

    • 1,首先下载源码
      image
      上图中的Java后台源码,下载到桌面并解压
    • 2,点击open导入上图的java源码,下面两种方式都可以
      image
      image
    • 3,选择你解压后的源码
      image
    • 4,导入成功后如下图
      image
    • 5,确认下项目是不是使用的jdk8,有时候不用jdk8有可能会报如下错误
      image
      解决方法如下图
      image
      image

    二,安装mysql8数据库

    我们这里要安装的是mysql8.0数据库。只要是8.0开头的,不管是8.0.11还是8.0.19都可以。
    数据库的安装,我在点餐视频的第3章的2,3,4节里都有讲。
    image

    2-1我们在进行第3节的idea链接mysql数据库操作时,会遇到下面一个错误。

    image
    时区错误,MySQL默认的时区是UTC时区,比北京时间晚8个小时。所以要修改mysql的时区。

    解决:

    找到mysql安装目录并进入bin文件夹,我的是安装在c盘
    image
    然后输入cmd,回车
    image
    输入:mysql -uroot -p123456进入mysql命令模式
    image
    然后输入

     set persist time_zone='+8:00';
    

    再次连接成功
    image
    配置完后,点击下test,如果出现绿色对勾,即代表链接成功。然后点击ok

    2-2,有的同学也会遇到下面这样的问题

    image
    image
    image
    这是因为驱动没有安装的问题。

    解决
    image
    问题出在了上图所示的地方。这个地方你如果有看我视频,肯定知道在哪里的。
    我们下面就来说下怎么解决吧。
    image
    一定要注意,上图我使用的是com.mysql.jdbc.Driver这个数据库驱动。
    然后下面的8.0.15的添加是先点加号,然后再如下图所示。
    image

    也可以去看下点餐系统常见问题汇总:

    https://blog.csdn.net/qiushi_1990/article/details/104857088

    三,创建diancan数据库和相关数据表

    如果下面第3步箭头是灰色无法点击,说明你mysql数据库没有链接成功,去看下上面第二步里提到的视频。
    image
    idea链接数据库成功后,我们再来执行qcl.sql文件。
    image
    到这里我们数据相关的配置就完成了。

    四,本地运行项目

    点击下图绿色箭头,运行项目
    image
    如果你上面绿色三角不能点,说明程序有错误。
    通过下面这个run可以看报错信息
    image
    项目运行成功的标示如下图
    image

    五,运行成功的检验

    输入下面网址,如果返回下面文字,就代表启动成功了
    image
    输入下面网址,即可进入登陆页面。
    image
    注意端口号要和你设置页里的保持一致
    image

    六,(导源码常见问题)程序包lombok不存在

    如果不存在下面错误,直接跳过即可
    image
    通常报这个错误,是因为,我们的开发者工具idea没有安装lombok库导致的

    6-1解决办法如下:

    提示我们没有安装,我们就安装一个不就行了,下面来教大家如何安装。
    1,点击扳手进入设置页
    image
    2,点击plugins,然后搜索lombok,点击install即可安装
    image
    3,安装完成后,重启idea开发工具即可
    image

    到这里java的部署就讲完了。下面讲小程序源码的导入

    小程序部分

    一,下载小程序源码并解压

    image

    二,打开小程序开发者工具,并导入小程序源码

    1,点击加号创建小程序项目
    image
    2,导入源码,填写自己的appid
    image
    至于appid如何获取,我这里不做讲解了,我零基础入门小程序的视频里都有讲解的:https://edu.csdn.net/course/detail/25749

    三,配置小程序云开发,用于获取小程序openid

    1,开通小程序云开发
    image
    这里云开发用免费版就可以了。
    2,把app.js里的云开发环境id换成你自己的
    image
    至于云开发的一些基础知识,本节不做讲解,有不懂的可以去看下我们的零基础入门小程序云开发视频:https://study.163.com/course/courseMain.htm?courseId=1209499804
    3,部署getopenid云函数
    image
    4,编译项目,如果能请求到openid即代表云函数部署成功了
    image

    四,运行小程序

    这和你上面java的运行要保持一致,如果是本地的java项目运行你就用 localhost
    image
    如果你是部署到服务器了,这里就要用你的服务器域名。
    image

    五,编译小程序

    image

    如果上述菜品栏没有数据,记得去自己的管理后台,先添加类目,再添加菜品
    image
    image
    上面两步操作,可以批量导入,相应的数据,我也再网盘里给大家准备好了。
    image
    到这里我们点餐系统的java后台和微信小程序就完整的部署了。有问题,可以加我微信2501902696。

    后面再有问题,我也会持续在这里给大家更新出来的:

    https://blog.csdn.net/qiushi_1990/article/details/104857088

    展开全文
  • 前端所用技术为微信小程序,后台应用JAVA,同时包含数据库的多种技术,对于所需要的软件,配置过程也都有详细的讲解,最后制作出来的小程序具有扫码点餐,排号等功能,如果有需要还可以进行实际的商用,适合小程序的...

    前端所用技术为微信小程序,后台应用JAVA,同时包含数据库的多种技术,对于所需要的软件,配置过程也都有详细的讲解,最后制作出来的小程序具有扫码点餐,排号等功能,如果有需要还可以进行实际的商用,适合小程序的初学者
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    了解详情可以私聊,感谢大家支持与帮助!

    展开全文
  • 扫码点餐java后台+小程序源码
  • JAVA扫码点餐(1)-项目介绍

    千次阅读 2018-11-01 18:00:24
    一直深圳工作,看到很多餐厅都实现自主扫码点餐,然后想想自己也做一个。说做就做,17年国庆来了,就利用工作闲余时间做了一个。 项目构思 开动之前想法: 表设计相关。 技术选型。 开发计划。 开发过程。 ...
  • 开发环境及工具: 大于Jdk1.8,大于mysql...扫描小程序进入首页(每个座位一个小程序) 首页显示轮播图,菜品分类,菜品列表(可带推荐算法),可以根据分类展示菜品,可以加入购物车购物车下单,点击菜品进入菜
  • JAVA扫码点餐(3)-客户端详解

    千次阅读 2018-11-02 09:59:47
    客服端扫描二维码(打开...客官,既然都看到这里了,帮忙测试下呗,拿出支付宝,谢谢!   有意做类似软件的可以私信我,买源码也可以私信我。可做毕业设计,有成功案例! 转载请注明出处:【 ...
  • 后台技术选型:JDK8MySQLSpring-bootSpring-data-jpaLombokFreemarkerBootstrapWebsocket小程序端技术选型微信小程序小程序端扫码点餐菜品分类显示模拟支付评论系统购物车
  • JDK8/Java11 Mysql5.7/Mysql8 Spring-boot2.2.4 Spring-data-jpa Lombok Freemarker Bootstrap4.3 Websocket即时通讯 Tomcat服务器 Excel数据的批量导入与导出 小程序端技术选型 微信小程序 css3 JavaScript ...
  • JAVA扫码点餐(2)-项目过程

    千次阅读 2018-11-02 09:06:16
    项目框架 maven项目:分为三个项目: online-foods-services:公共...online-foods-controller:前端页面展示,可以在支付宝中打开的H5页面。 代码片段 public class AlipayClientHelper { private sta...
  • 扫码点餐小程序源码

    2021-11-04 15:50:29
    扫码点餐小程序源码 ...本次为大家代理易客多扫码点餐小程序系统源码,可以无限开商户的微信小程序和支付宝小程序,支持支付宝的返佣和微信的返佣政策。源码仅供学习交流。 https://wwt.lanzoui.com/iw7RKt7sbfa ...
  • 微信小程序点餐系统前端以及后台代码,后台是基于SpringBoot,有专门的后台管理系统;前端简单扩容性强
  • 扫码点餐。 在高峰期,顾客可在排队期间通过手机扫描餐厅门口展架上的二维码,进入点餐小程序,率先查看菜单,进行预先点餐,热销菜、创意菜、时令菜、优惠菜,应用尽有,提前将要选的菜放入购物车,一键下单,用完即...
  • 今天来给大家讲解一个完整的微信扫码点餐项目。java后台+微信小程序实现点餐系统。后台技术选型:JDK8MySQL(需要5.6以上)Spring-bootSpring-data-jpaLombokFreemarkerBootstrapWebsocket小程序端技术选型微信小...
  • 6.2.2 扫码点餐模块 33 6.2.3 购物车模块 34 6.2.4 接单提醒模块 34 6.2.5 菜品新增模块 35 6.2.6 新增菜品类目模块 35 7.结论 36 7.1 系统技术总结 36 7.2 系统功能总结 38 7.3 系统展望 38 致谢 40 参考文献 41
  • 最近在做一个需求,也是公众号常用的功能-《扫码点餐》。 在店铺桌子贴一张固定二维码,用户扫码后进入公众号窗口①,推送模板消息(点餐消息)给用户②。 ① 用户已关注公众号,则到关注页面;已关注则直接进入...
  • 扫码点餐软件开发平台,找【金生157威6875店2419同号】扫码点餐系统开发模式 扫码点餐系统源码搭建 扫码点餐系统小程序开发,扫码点餐系统APP开发 扫码点餐系统案例模式扫码点餐软件开发简单的操作方式1.商家5分钟...
  • 应用技术:java|jsp+mysql 开发工具:Myeclipse、jdk、tomcat、mysql数据库。送所有开发工具,送系统以及所有开发工具的安装调试指导文档,保证你零基础也能运行程序。 二、功能模块介绍: 订餐系统分为前...
  • 一套用户餐厅点餐的系统,用户扫码点餐,自动打单 1.0版本(演示版本为2.0,请直接看最下面的2.0版本) 软件架构 springboot + jpa + mysql 安装教程 clone代码下来 使用maven更新依赖包 在数据库中创建好数据库...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 642
精华内容 256
关键字:

扫码点餐系统java

java 订阅