前言

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

成品预览

主界面

功能介绍

订单管理系统,实现了对订单的增删改查。且实现了将订单内容写入文件,每次增删改查都会做保存,下次重启程序时会自动加载之前已存入的订单,简单采用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. 动态规划二 & 贪心算法 实验三

    一.贪心算法和动态规划法解决背包问题. 有一个背包其容积 C = 13.现有表格内的物品可以购买. 商品 价格 P 体积 V 啤酒 24 10 汽水 2 3 饼干 9 4 面包 10 5 牛奶 9 4 ...

  2. Linux下Python环境安装

    Linux通常都附带Python环境,但是Linux附带的大多数Python都是2.7.5版本.如果我们想使用Python3或者Anaconda3,最好安装一个新的Python3环境,但不要尝试删除P ...

  3. Mysql优化篇-索引优化与查询优化

    1.索引失败案列 如果查询时没有使用索引,查询语句就会扫描表中所有记录,在数据量大的情况下,查询会很慢. (1)全值匹配 (2)最佳左前缀法则 mysql可以为多个字段创建索引,一个索引可以包括16个 ...

  4. 【Qt6】列表模型——便捷类型

    前一篇水文中,老周演示了 QAbstractItemModel 抽象类的继承方法.其实,在 Qt 的库里面,QAbstractItemModel 类也派生了两个基类,能让开发者继承起来[稍稍]轻松一些 ...

  5. 物理standby database的日常维护【转】

    1.停止Standby select process, status from v$managed_standby; --查看备库是否在应用日志进行恢复 alter database recover ...

  6. Java-网络编程(TCP-UDP)

    Java-网络编程(TCP-UDP) 网络基础 网络编程最主要的工作就是在发送端把信息通过规定好的协议进行组装包,在接收端按照规定好的协议把包进行解析,从而提取出对应的信息,达到通信的目的.中间最主要 ...

  7. 【接口测试】如何在 Eolink Apilkit 中使用 cookie ?

    什么是 Cookie ? Cookie是一种在网站之间传递的小型文本文件,用于存储用户的个人信息和偏好设置.当您访问一个网站时,网站会将Cookie存储在您的浏览器中,并在您下次访问该网站时读取该Co ...

  8. 【技术积累】《MongoDB实战》笔记(1)

    <MongoDB实战>笔记 第一章 为现代Web而生的数据库 特性 mongodb适合做水平扩展的数据库. mongodb把文档组织成集合,无schema. 索引 mongodb的二级索引 ...

  9. 立方骑士(lgP7354)

    来水篇题解((( 图炸了,去洛谷博客看吧. 注:在本篇题解中, \(K\) 表示国王, \(N\) 表示骑士,不同颜色的 \(X\) 表示该位置国王可以达到,且被与之相同颜色的骑士封锁.方法不唯一,图 ...

  10. Spring系列:基于XML的方式构建IOC

    目录 一.搭建模块spring6-ioc-xml 二.获取bean的三种方式 三.基于setter注入 四.基于构造器注入 五.特殊值处理 六.为对象类型属性赋值 七.引入外部属性文件 八.基于XML ...