前言

这是大学时候上设计模式这门课写的程序,当时课程任务是要求结合五个设计模式写一个系统,最近偶然翻到,把系统分享一下。

成品预览

主界面

功能介绍

订单管理系统,实现了对订单的增删改查。且实现了将订单内容写入文件,每次增删改查都会做保存,下次重启程序时会自动加载之前已存入的订单,简单采用txt存文件到本地。

功能描述:

(1) 增加订单功能:能对不同商品组合实现实时计算价格,并且根据用户的身份产生vip用户价格和普通用户价格,并在订单添加到已有的订单列表中。并且内置了商品菜单,点击商品菜单按钮可以显示详细的商品菜单。 如果未确认选择先提交订单,会提示“订单为空,无法提交”。 如果未确认选择而单击撤回选择,会提示“订单为空无法撤回”。 如果未选择客户类型便进行确认选择,会提示“未选择客户类型”。

(2) 查找订单功能:输入订单号实现对订单查询操作。能实现对订单号格式的校验,只能是数字格式,并且非空,若格式错误会弹窗提示,当订单不存在时候也会弹出错误提示。

(3) 删除订单功能:输入要删除的订单号,完成对订单的删除。并且可以撤回删除操作。当想恢复上一次删除的内容时,单击撤回删除按钮即可实现。能实现对订单号格式的校验,只能是数字格式,并且非空,若格式错误会弹窗提示,当订单不存在时候也会弹出错误提示

(4) 修改功能:使用了JTable,直接双击表格文本框即可完成修改和保存。

使用的设计模式

装饰者模式

在增加新订单中,对订单的计价和描述使用了装饰者模式。原先没有装饰者模式,则需要对每种组合都定义一个类,在类中设置其相关的价格和描述属性,将会使得类的数量庞大。应用该模式后,可以大大减少类的数量。 使用装饰者模式。有咖啡和茶两种饮品,都继承自一个抽象类Drink。配料有糖分,牛奶,豆浆三种配料,将配料作为decorator装饰饮品,继承自decorator,同时decorator又继承自Drink类。使用装饰模式,可以动态的给对象添加额外的功能,即包装原有的类。这样子,一个饮品添加多个配料,实现对饮品对象的多次包装,每次包装都后都能保存对象原有的功能属性。这种情况下,无需增加不同组合的类,即可完成对每个组合的商品描述和计价。

UML图:

组合模式

在增加新订单功能中,有显示商品菜单选项。对商品菜单的展示则应用了组合模式。如果菜单没有使用组合模式,将不能很好的实现管理操作,如对菜单的一级目录,二级目录,三级目录……的添加,删除,遍历。 应用组合模式,在该系统中,一级目录对应饮品(Drinks类),二级目录对应咖啡,茶,配料(DrinkTypes),三级目录(SpecificTypes)是二级目录各饮品的详细种类。将菜单的一级目录,二级目录,三级目录看成是组织结构,将他们的关系看成树形结构,这样子利于实现管理操作。能通过add的操作,向现有的菜单中添加新的目录选项,或者通过remove操作,删除对应目录下不需要的内容。

UML图:

备忘录模式

撤销删除功能,应用到了备忘录模式。没有使用备忘录模式前,备份删除前的状态需要new一个新的对象,并把需要备份的数据存到对象中,这暴露了对象内部的细节,如果需要备份的对象很多,这将不利于管理,开销也会变大。 备忘录模式能在不破坏封装性前提下,捕获对象的状态,在对象之外保存这个状态,并可用于恢复保存的状态。在订单管理下,Memento为订单orderList的备份类,careTaker用于维护以Memento为元素的List。当有订单被删除时,删除前的orderlist的状态就会被保存到careTaker的MementoList中。这时,选择撤销的话careTaker就会从List中选取上次备份的内容,完成撤回操作。

UML图:

代理模式

对vip用户和普通用户的区别计价,用到了代理模式。使用代理模式,对订单的总价格RealPrice类,提供一种代理以控制对这个对象的访问。RealPrice类(被代理类)和Proxy类(代理类)都实现同一个接口ProductPrice,在Proxy类实现实际业务逻辑,在该代理类的控制下,普通客户访问将得到原价价格,vip客户访问将得到八八折的价格。代理模式在一定程度上降低了耦合度,且如果对代理类做修改,则无需对被代理类进行改动,使得系统具有良好的灵活性和可扩展性,比如想新增一种客户类型,则直接更改代理类即可。

UML图:

单例模式

在图形界面中,对查看所有订单界面(GuiMain类)和增加新订单界面(GuiAdd类)会来回切换,若不使用单例模式,每次切换都要new一个新的界面对象,频繁的进行创建对象,耗费资源。 而使用单例模式,可以保证该类中只存在一个这样的对象,确保只有单个对象被创建,节省了系统资源,可以提高系统的性能。在单例模式下,查看所有订单界面(GuiMain类)和新增新订单界面(GuiAdd类)都是通过使用getInstance函数创建唯一的实例,解决了耗费资源的情况。

UML图:

使用

打开IDEA,运行main包中的MainTest启动程序

进入程序主界面,载入已保存的订单



增加新订单:



返回主界面,在最后一行能找到新增的订单

查看商品菜单

未选择客户类型时候:

未确认选择情况下撤回选择

未确认选择情况下提交订单

存在未提交订单情况下点击确认选择:

查找订单:

订单号不存在,或者订单格式有问题:

删除订单:

订单号不存在,或者订单格式有问题:

撤回删除: 执行撤回前:

执行撤回后:

不存在删除操作时:

修改订单:单击修改订单显示

直接在表格上即可进行修改,修改将自动保存

遇到的问题

在程序调试时,遇到一个大问题,无法让显示订单的表格实时更新内容 。使用JAVA图形界面,想实现对所有订单在同一个界面显示,并且要其支持修改和保存。这种情况下用JTable可以来实现所有订单的显示。但用了JTable后,却发现订单的新增,删除,表格都不会刷新新数据,在此尝试了好多种办法解决。在经过长时间的钻研下,发现借助DefaultTableModel对象可以实现,之后再使用Vector数组存储表格每行每列的数据,调用setDataVector方法为DefaultTableModel对象存值。每次新增,删除订单都重复上述操作,使得表格内的内容能被实时更新。

合理运用设计模式,无疑是可以简化类的数量,简化不必要的代码,使系统代码可读性更高,更简洁,且可以优化系统的性能。如对单例模式的应用,能使对象不会被重复new出来,节约系统资源。再如装饰者模式可以大幅度减少类的数量,使用decorator对特定对象添加功能,即可实现不同组合。合理运用设计模式,是可以减少类之间的耦合性,并使得系统的扩展性得到提高。

链接

scottyzh/MilkTea-Order-System: 奶茶订单生成系统,使用多种设计模式 (github.com)

Java五种设计模式实现奶茶订单生成系统小DEMO的更多相关文章

  1. Java互联网架构-Mysql分库分表订单生成系统实战分析

    概述 分库分表的必要性 首先我们来了解一下为什么要做分库分表.在我们的业务(web应用)中,关系型数据库本身比较容易成为系统性能瓶颈,单机存储容量.连接数.处理能力等都很有限,数据库本身的“有状态性” ...

  2. PHP中常见的五种设计模式

    设计模式只是为 Java架构师准备的 — 至少您可能一直这样认为.实际上,设计模式对于每个人都非常有用.如果这些工具不是 “架构太空人” 的专利,那么它们又是什么?为什么说它们在 PHP 应用程序中非 ...

  3. java 23种设计模式及具体例子 收藏有时间慢慢看

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代 码可靠性. 毫无疑问,设计模式 ...

  4. java 23 种设计模式

    一.设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接 ...

  5. (转)java 23种设计模式

    设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  6. Java 23种设计模式详尽分析与实例解析之三--行为型模式

    Java设计模式 行为型模式 职责链模式 模式动机:职责链可以是一条直线.一个环或者一个树形结构.链上的每一个对象都是请求处理者,职责链模式可以将请求的处理组织成一条链,并使请求链传递,由链上的处理者 ...

  7. java 23种设计模式,一般情况下,常用的有哪些? 转载

    原址:http://wangle.iteye.com/blog/196972 工厂模式, 工厂方法模式,单例模式, 外观(Facade)模式, 观察者(Observer)模式,桥接(Bridge)模式 ...

  8. Java 23种设计模式

    转自: http://zz563143188.iteye.com/blog/1847029 ; i<count; i++){ list.add(new MailSender()); } } pu ...

  9. java 23种设计模式教程

    设计模式分类 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模 ...

  10. java 23种设计模式 深入浅出

    以下内容只作为对自己对知识进行总结,如有引用他人文章会在文段末尾表明出处: Java的23种设计模式 23种设计模式总共可以分为三大类,进行不定期更新总结,将逐步展开介绍自己对设计模式的理解,多多指教 ...

随机推荐

  1. trino on yarn

    一.前言 最近在研究trino on yarn 功能,网上大部分都是关于presto on yarn文章,关于trino on yarn 资料很少,但是本质上差不多,需要修改一些内容比,主要在调试方面 ...

  2. UI自动化项目1说明 | 网页计算器自动化测试项目

    需求: 1.对网页计算器, 进行加法的测试操作. 通过读取数据文件中的数据来执行用例. 2.网址: http://cal.apple886.com/ 测试点: 1.加法:1+1=2 2+9!=10 . ...

  3. 图解Spark排序算子sortBy的核心源码

    原创/朱季谦 一.案例说明 以前刚开始学习Spark的时候,在练习排序算子sortBy的时候,曾发现一个有趣的现象是,在使用排序算子sortBy后直接打印的话,发现打印的结果是乱序的,并没有出现完整排 ...

  4. 「codeforces - 585E」Present for Vitalik the Philatelist

    link. 设 \(\displaystyle f(x) = \# S', s.t. S' \subseteq S, S' \neq \varnothing, \gcd(S') = x\),\(g(x ...

  5. java开发面试笔记

    目录 1.hashMap hashmap源码分析-逐行注释版: 2.线程池 3.MySQL数据库引擎.事务.锁机制 1. 引擎 2. 事务 索引 3. 锁: 4. 调优问题怎么回答? 4.SQL语句 ...

  6. 其它——windows提示缺少VCRUNTIME140.dll错误

    文章目录 一 原因 二 解决方法一 三 解决方法二 缺少了Microsoft.Net.Framework的安装 一 原因 最新在系统安装一些软件发现提示 这是因为缺少了一下windows运行需要的库 ...

  7. ElasticSearch系列——介绍、安装、插件介绍、安装ElasticSearch插件、安装Kibana、安装中文分词器、倒排索引、索引操作、映射管理

    文章目录 ElasticSearch之介绍 一 Elasticsearch产生背景 1.1 大规模数据如何检索 1.2 传统数据库的应对解决方案 1.3 非关系型数据库解决方案 1.4 内存数据库解决 ...

  8. MySQL系列之优化——1.优化哲学、2. 优化工具的使用、3. 优化思路分解、4. MySQL参数优化测试、5.1 参数优化、6. 参数优化结果、7. 锁的监控及处理、8. 主从优化

    文章目录 1.优化哲学 1.1 为什么优化? 1.2 优化风险 1.3 谁参与优化 1.4 优化方向 1.5 优化的范围及思路 优化效果和成本的评估: 2. 优化工具的使用 2.1 系统层面的 2.1 ...

  9. 在 Mac 上撰写和格式化备忘录-添加提醒-添加日历

    在 Mac 上撰写和格式化备忘录 您可以撰写备忘录以及更改备忘录的格式,例如,更改字体大小或对齐方式,或者使文本变为粗体.如果您使用的是升级后的 iCloud 备忘录或者储存在您 Mac 上的备忘录, ...

  10. ES6和node模块化

    node模块化: 1.输出:exports.a=12; 或者module.exports={ a:12, b:5 } 2.引入:require('./a.js'); 3.引用自定义模块 放到node_ ...