运用设计模式设计一个票务系统(策略模式使用)
策略模式在票务系统的使用
为什么要选用策略模式
票务系统为用户分等级,普通用户,白银用户,黄金用户; 每种不同的用户都有不同的折扣策略。
同时,为了系统的开放性,我们设计的项目是可以添加新的用户级别同时不修改源代码。
(资料图片仅供参考)
这些就恰恰是策略模式能解决的问题,这就是为什么我要选它。
不懂策略模式的小伙伴可以看我的介绍: 【设计模式】行为型模式其九: 策略模式 - 掘金 (juejin.cn)
项目中书写
策略抽象类
// 定义打折方法
public interface Discount { BigDecimal discount(BigDecimal price);}复制代码
具体策略类
// 普通用户采取不打折策略
public class NormalDiscount implements Discount{ private final double discount; public NormalDiscount(){ this.discount = 1.0; } @Override public BigDecimal discount(BigDecimal price) { return price.multiply(new BigDecimal(discount)); }}复制代码
// 白银用户采取打八折的方式
public class SilverDiscount implements Discount{ private final double discount; public SilverDiscount(){ this.discount = 0.8; } @Override public BigDecimal discount(BigDecimal price) { return price.multiply(new BigDecimal(discount)); }}复制代码
// 黄金用户采取打六折的方式
public class GoldDiscount implements Discount{ private final double discount; public GoldDiscount(){ this.discount = 0.6; } @Override public BigDecimal discount(BigDecimal price) { return price.multiply(new BigDecimal(discount)); }}复制代码
具体环境类
将打折功能放在一个对象内,公开一个获得价格接口,便于调用和统一处理
public class Price { private BigDecimal price; private Discount discount; public void setPrice(BigDecimal price){ this.price = price; } public void setDiscount(Discount discount){ this.discount = discount; } public BigDecimal getPrice(){ return discount.discount(this.price); }}复制代码
XML 文件
com.example.ticket.service.stratege.SilverDiscount 复制代码
XMl文件读取类
public class DiscountXmlUtil { public static Object getBean(){ DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); try { DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); Document doc = documentBuilder.parse(\"D:\gitee icket icket-management-system icket\src\main\" + \"\resources\" + \"\discount.xml\"); NodeList className = doc.getElementsByTagName(\"className\"); Node firstChild = className.item(0).getFirstChild(); String nodeValue = firstChild.getNodeValue(); Class>aClass = Class.forName(nodeValue); Constructor>constructor = aClass.getConstructor(); return Class.forName(nodeValue).getConstructor().newInstance(); } catch (ParserConfigurationException | IOException | SAXException | ClassNotFoundException | InvocationTargetException | InstantiationException | IllegalAccessException | NoSuchMethodException e) { throw new RuntimeException(e); } }}复制代码
具体调用类
我们这算是一个系统,所以我们何时会去使用价格打折机制呢?
没错,就是生成订单的时候,所以我们调用方法写在service层里。
那我们肯定是要根据前端传来的用户信息,读取用户类的身份字段,并为其选择合适的打折策略。
@Overridepublic SysOrder getOrder() { // 获得价格对象 Price price = new Price(); // 设置商品价格 price.setPrice(new BigDecimal(\"10.00\")); // 设置打折策略, 根据XML文件来设置 price.setDiscount((Discount) DiscountXmlUtil.getBean()); // 通过统一接口来获得价格 BigDecimal price1 = price.getPrice(); // 之后就是对Order对象的封装, 省略。。。。。。 System.out.println(price1); return null;}复制代码
一些细节提示
具体类里的discount字段属于赋值一次,永远不变的,所以加上final字段。 当你想要添加其它打折策略, 可以直接继承Discount,然后改写方法即可 当你还要进行一些特殊操作,比如添加积分,可以在具体打折类进行操作。当然,我更建议在Price对象里进行操作,毕竟这算是一种公共操作,可以在Price里统一进行。 根据XML文件来动态生成策略类,这样虽然不会修改源代码,但是需要根据用户身份来修改XML文件,所以我们还得在DiscountXMLUtil类中书写修改XML文件的方法。原文链接:https://juejin.cn/post/7226013112406294589
-
运用设计模式设计一个票务系统(策略模式使用)
程序猿阿嘴 2023-04-27
-
花都幼儿园 黄秀_天天即时
四川教育在线 2023-04-27
-
环球今头条!铁路南京站4月29日预计发送旅客39.5万人次,或创新高
澎湃新闻 2023-04-27
-
星月合击传奇_180星月合击 全球通讯
互联网 2023-04-27
-
环球即时看!广西金秀修表匠70年钟表人生:以匠心修复“时光”
中国新闻网 2023-04-27
-
徐汇区召开民营经济圆桌会,启动区工商联民生实事项目
新民晚报 2023-04-27
-
程序语言有哪些成分组成?_程序语言有哪些
互联网 2023-04-27
-
27日北向资金小幅净卖出 深股通净买入3.47亿元
证券时报网 2023-04-27
-
焦点速递!扬农化工(600486)看好新项目驱动成长
扬农化工 2023-04-27
-
全球快消息!河南修武:开启不动产抵押登记“无纸化办理”服务模式
大河网 2023-04-27
-
运用设计模式设计一个票务系统(策略模式使用)
程序猿阿嘴 2023-04-27
-
花都幼儿园 黄秀_天天即时
四川教育在线 2023-04-27
-
环球今头条!铁路南京站4月29日预计发送旅客39.5万人次,或创新高
澎湃新闻 2023-04-27
-
星月合击传奇_180星月合击 全球通讯
互联网 2023-04-27
-
环球即时看!广西金秀修表匠70年钟表人生:以匠心修复“时光”
中国新闻网 2023-04-27
-
徐汇区召开民营经济圆桌会,启动区工商联民生实事项目
新民晚报 2023-04-27
-
程序语言有哪些成分组成?_程序语言有哪些
互联网 2023-04-27
-
27日北向资金小幅净卖出 深股通净买入3.47亿元
证券时报网 2023-04-27
-
焦点速递!扬农化工(600486)看好新项目驱动成长
扬农化工 2023-04-27
-
全球快消息!河南修武:开启不动产抵押登记“无纸化办理”服务模式
大河网 2023-04-27
-
50万左右的实用之选,与奥迪Q7同平台,纯进口标配四驱,实拍途锐|全球速读
懂车帝 2023-04-27
-
音乐节票价狂涨,钱都进了谁的口袋
钱江晚报 2023-04-27
-
电力市场和规划的下一步
华夏能源网 2023-04-27
-
滚动:男的也可以报销生育保险?2023男方生育保险能报销多少钱?
社保网 2023-04-27
-
让乡村教育赋能乡村振兴(一线行走)-全球快播
人民日报 2023-04-27
-
世界动态:知名UP主爆料前男友致病,呼吁女性珍惜自己!
自选股智能写手 2023-04-27
-
口碑好才能长期好
中国经济网-《经济日报》 2023-04-27
-
天天实时:中期改款林肯冒险家将于 5 月 18 日上市
爱卡汽车 2023-04-27
-
配置调整,雷达RD6创业版正式上市,售价14.58万元
懂车帝 2023-04-27
-
长城证券炼金术4.0“焕新成长 伴你同行”正式发布,引领财富管理转型
2023-04-27
-
天天热资讯!天风证券:多省电价仍有望保持高比例上浮,火电盈利能力或进一步修复
界面新闻 2023-04-27
-
焦点讯息:离婚案件中过错方的过错指的是什么
法师兄 2023-04-27
-
建知识产权强区,粤港澳创新创业知识产权综合服务平台在广州南沙上线
羊城派 2023-04-27
-
西藏药业:连续6日融资净买入累计2238.55万元(04-26)-世界时快讯
东方财富Choice数据 2023-04-27
-
Roku盘后涨逾2%一季度业绩超预期
和讯马金露 2023-04-27
-
天天快报!跟着的拼音怎么读_跟着的拼音
互联网 2023-04-27
-
即时看!中粮科工(301058):4月26日北向资金减持5.76万股
证券之星 2023-04-27
-
死神人物图鉴_死神人物
互联网 2023-04-27
-
中国公安部就美国起诉中国执法人员向美执法部门提出严正交涉抗议 百事通
中国新闻网 2023-04-26
-
使用函数调用的闪灯程序
哔哩哔哩 2023-04-26