当前位置: 首页 > news >正文

上海网站建设网络公司宝石汇网站

上海网站建设网络公司,宝石汇网站,最新新闻热点事件2021年10月,网站建设公司 信科便宜一、什么是策略模式 策略模式是一种行为设计模式#xff0c;它允许在运行时选择算法或行为#xff0c;并将其封装成独立的对象#xff0c;使得这些算法或行为可以相互替换#xff0c;而不影响使用它们的客户端。#xff08;ChatGPT生成#xff09; 主要组成部分#xff…一、什么是策略模式 策略模式是一种行为设计模式它允许在运行时选择算法或行为并将其封装成独立的对象使得这些算法或行为可以相互替换而不影响使用它们的客户端。ChatGPT生成 主要组成部分 1、策略Strategy 定义了一个算法族、行为或方法并将其封装在一个接口或抽象类中使得这些算法可以相互替换。 2、具体策略Concrete Strategy 实现了策略接口提供了具体的算法或行为实现。 3、上下文Context 持有一个策略对象的引用在运行时可动态切换不同的策略。 原理 1、策略模式允许在运行时动态选择算法或行为通过将具体的算法或行为封装成策略对象然后将这些策略对象注入到上下文中。 2、上下文根据不同的需求或条件选择合适的策略对象并使用它执行特定的算法或行为。 优点 1、易于扩展和维护 可以方便地添加新的策略或修改现有策略不影响原有代码。 2、避免条件语句 可以避免大量的条件语句提高代码可读性和可维护性。 3、代码复用 可以通过共享策略对象来提高代码的复用性。 二、场景模拟 为了应用策略模式我们模拟一个场景。在一个企业资源管理ERP系统中可能会涉及到成本的计算其中需要计算的成本例如钢材、油漆、人工、运输等等虽然说计算成本都是“单价*数量”但是有些成本例如钢材不仅要计算钢材的成本而且放置钢材或者其它费用也需要进行一定的计费对于人工成本还需要计算企业担负的五险一金等。 如上图所示钢材是由吨数*单价计算的但是要考虑保管费或其他费用假设一吨n元后续还可能考虑其它费用等人工费用雇员一人可能工资12000元公司要负担其12%公积金或者医疗保险等运输要考虑车辆维护费或者日常损耗。以上仅是模拟真实环境可能更加复杂或简单。 三、业务实现 3.1、使用IF-ELSE方法 public static BigDecimal useIfElse(String name, BigDecimal amount, BigDecimal price){if (name.equals(plate)) {// 单价×数量再加上每吨200元的其它费用return amount.multiply(price).add(amount.multiply(new BigDecimal(200.00)));} else if (name.equals(paints)) {// 单价×数量再加上每吨200元的其它费用return amount.multiply(price).add(amount.multiply(new BigDecimal(100.00)));} else if (name.equals(employer)) {// 人员×数量再加上每吨200元的其它费用BigDecimal sum amount.multiply(price); // 基本工资sum sum.add(amount.multiply(price.multiply(new BigDecimal(0.12)))); // 加上额外支付的12%公积金return sum;} else if (name.equals(haulage)) {// 吨数×数量再加上每吨300元的损耗费用return amount.multiply(price).add(amount.multiply(new BigDecimal(300.00)));} else {log.error(无法匹配);return new BigDecimal(0);}} 我们用IF-ELSE方法确实是可以实现功能可以看出来很麻烦看起来很混乱没有结构也没办法实现一些定制功能后续变动起来也比骄困难因为有一些东西都是写死的。我们来测试一下 public static void main(String[] args) {// 钢板单价及数量BigDecimal plateAmount new BigDecimal(15);BigDecimal platePrice new BigDecimal(888.88);// 油漆价格及数量BigDecimal paintsAmount new BigDecimal(20);BigDecimal paintsPrice new BigDecimal(490.00);// 雇员工资及人数BigDecimal employerAmount new BigDecimal(10);BigDecimal employerPrice new BigDecimal(10000.00);// 运输价格及吨数BigDecimal haulageAmount new BigDecimal(25);BigDecimal haulagePrice new BigDecimal(3000.00);// 计算各个成本BigDecimal plate useIfElse(plate, plateAmount, platePrice);BigDecimal paints useIfElse(paints, paintsAmount, paintsPrice);BigDecimal employer useIfElse(employer, employerAmount, employerPrice);BigDecimal haulage useIfElse(haulage, haulageAmount, haulagePrice);BigDecimal sum plate.add(paints).add(employer).add(haulage);log.info(钢材:{}元,油漆{}元,雇员:{}元,运输:{}元,总计:{}元, plate, paints, employer, haulage, sum);} 可以看到确实正确的计算出了结果但是这种方式不具有拓展性随着程序功能的增加会越来越混乱。那有些同学可能会说为什么不用Switch-Case方法那就来实践一下。 3.2、使用Switch-Case方法 public static BigDecimal useSwitch(String name, BigDecimal amount, BigDecimal price){switch (name) {case plate:// 单价×数量再加上每吨200元的其它费用return amount.multiply(price).add(amount.multiply(new BigDecimal(200.00)));case paints:// 单价×数量再加上每吨200元的其它费用return amount.multiply(price).add(amount.multiply(new BigDecimal(100.00)));case employer:// 人员×数量再加上每吨200元的其它费用BigDecimal sum amount.multiply(price); // 基本工资sum sum.add(amount.multiply(price.multiply(new BigDecimal(0.12)))); // 加上额外支付的12%公积金return sum;case haulage:// 吨数×数量再加上每吨300元的损耗费用return amount.multiply(price).add(amount.multiply(new BigDecimal(300.00)));default:log.error(无法匹配);return new BigDecimal(0);}} 使用Switch-Case方法后确实代码变得比较清晰了但是一些东西仍然是写死的不具备很好的扩展性。 3.3、使用策略模式重构代码 其中ICosts是一个接口里面只有一个方法就是成本的计算。他的实现类包含钢材、油漆、人工等等可以有很多。Context是策略控制类外部可以传递不同策略执行计算成本方法。 3.3.1、编写成本计算接口 public interface ICostsT, K, V {/*** 成本计算* param amount 数量* param price 单价* param other 其它信息* return 成本金额*/BigDecimal calculateCosts(T amount, BigDecimal price, MapK, V other); } 解释一下amount为什么要用T表示因为这里数量不仅仅是BigDecimal形式的可能会涉及到人、车辆等等这种是没有小数点的……关于other就是一些附加信息例如钢材的除锈费用、维护费用人员的五险一金比例等等。 3.3.2、具体成本实现类 钢材 public class GCCosts implements ICostsBigDecimal, String, BigDecimal {/** 钢材成本* 1、基本成本吨数 * 价格* 2、存放成本吨数 * 存放消费* 3、防锈成本吨数 * 防锈成本* */Overridepublic BigDecimal calculateCosts(BigDecimal amount, BigDecimal price, MapString, BigDecimal other) {BigDecimal sum amount.multiply(price);// 计算存放成本if (other.containsKey(CF)) {sum sum.add(amount.multiply(other.get(CF)));}// 计算防锈成本if (other.containsKey(CX)) {sum sum.add(amount.multiply(other.get(CX)));}return sum;} } 油漆 public class YQCosts implements ICostsBigDecimal, String, BigDecimal {/** 油漆成本* 1、基础成本单价 * 数量* 2、存放成本 数量 * 存放费用* */Overridepublic BigDecimal calculateCosts(BigDecimal amount, BigDecimal price, MapString, BigDecimal other) {BigDecimal sum amount.multiply(price);if (other.containsKey(CF)) {sum sum.add(amount.multiply(other.get(CF)));}return sum;} } 人工 public class RGCosts implements ICostsLong, String, BigDecimal {/** 人工成本* 1、基础成本人数 * 工资* 2、公积金成本 人数 * 工资 * 公积金比例* 3、五险成本人数 * 工资 * 企业分摊比例* */Overridepublic BigDecimal calculateCosts(Long amount, BigDecimal price, MapString, BigDecimal other) {// 先计算每个人成本BigDecimal personCosts price;// 加公积金if (other.containsKey(GJJ)) {personCosts personCosts.add(price.multiply(other.get(GJJ)));}// 加五险if (other.containsKey(BX)) {personCosts personCosts.add(price.multiply(other.get(BX)));}return personCosts.multiply(BigDecimal.valueOf(amount)); // 计算总成本} } 运输 public class YSCosts implements ICostsBigDecimal, String, BigDecimal {/** 运输成本* 1、基础成本运输数量 * 运输单价* 2、损耗费用例如换机油养护等费用固定金额模拟* */Overridepublic BigDecimal calculateCosts(BigDecimal amount, BigDecimal price, MapString, BigDecimal other) {BigDecimal sum amount.multiply(price);// 加上固定的养护费用if (other.containsKey(YH)) {sum sum.add(other.get(YH));}return sum;} } 3.3.3、成本策略控制类 public class CostsContextT, K, V{private ICostsT, K, V iCosts;public CostsContext(ICostsT, K, V iCosts) {this.iCosts iCosts;}public BigDecimal calculateCosts(T amount, BigDecimal price, MapK, V other) {return iCosts.calculateCosts(amount, price, other);} } 此类充当一个调度作用不同的成本计算就选择不同的实现类然后执行calculateCosts()方法。 3.3.4、测试 public static void main(String[] args) {// 钢板单价及数量BigDecimal plateAmount new BigDecimal(15);BigDecimal platePrice new BigDecimal(888.88);MapString, BigDecimal plateMap new HashMapString, BigDecimal(){{put(CF, new BigDecimal(300));put(CX, new BigDecimal(200));}};// 油漆价格及数量BigDecimal paintsAmount new BigDecimal(20);BigDecimal paintsPrice new BigDecimal(490.00);MapString, BigDecimal paintsMap new HashMapString, BigDecimal(){{put(CF, new BigDecimal(300));}};// 雇员工资及人数// BigDecimal employerAmount new BigDecimal(10);Long employerAmount 10L;BigDecimal employerPrice new BigDecimal(10000.00);MapString, BigDecimal employerMap new HashMapString, BigDecimal(){{put(GJJ, new BigDecimal(0.12));put(BX, new BigDecimal(0.06));}};// 运输价格及吨数BigDecimal haulageAmount new BigDecimal(25);BigDecimal haulagePrice new BigDecimal(3000.00);MapString, BigDecimal haulageMap new HashMapString, BigDecimal(){{put(YH, new BigDecimal(1500));}};// 使用策略模式计算// 钢材CostsContextBigDecimal, String, BigDecimal plateCost new CostsContext(new GCCosts());BigDecimal plate plateCost.calculateCosts(plateAmount, platePrice, plateMap);// 油漆CostsContextBigDecimal, String, BigDecimal paintsCost new CostsContext(new YQCosts());BigDecimal paints paintsCost.calculateCosts(paintsAmount, paintsPrice, paintsMap);// 人工CostsContextLong, String, BigDecimal employerCost new CostsContext(new RGCosts());BigDecimal employer employerCost.calculateCosts(employerAmount, employerPrice, employerMap);// 运输CostsContextBigDecimal, String, BigDecimal haulageCost new CostsContext(new YQCosts());BigDecimal haulage haulageCost.calculateCosts(haulageAmount, haulagePrice, haulageMap);BigDecimal sum plate.add(paints).add(employer).add(haulage);log.info(钢材:{}元,油漆{}元,雇员:{}元,运输:{}元,总计:{}元, plate, paints, employer, haulage, sum);} 上面是一些各种成本的数量和单价信息同时使用Map存放了一些特有的成本信息然后下面我们使用成本策略控制类CostsContext装载不同的实现类来进行成本的计算。 可以看到成功的计算出了结果。我们不仅实现了功能也为后续的扩展打下了良好的基础例如后续加新的成本类型进行计算我们只需要继承ICosts实现不同的方法即可如果某一个类型的计算加了一些条件这样我们直接在Map里面添加条件并在相应的实体类进行处理即可这样让我们的代码结构变得清晰。 四、小结  if-else是我们初学代码时就接触到的代码伴随我们走过了很多年但是我们的思维一定要有提高不要一有需求就想到if-else确实if-else可以快速地实现功能我们不可否认但是随着项目复杂度的提高if-else已经无法满足我们的需求它会让我们的代码变得臃肿、复杂、结构混乱所以我们就想到要用其它方法来替代if-else让我们整个代码结构变得清晰。 上面我们介绍了使用策略模式来代替一堆的if-else策略模式的优点远不止如此 1、具有强的扩展性例如我们扩充新的成本计算只需要新建类并实现接口即可 2、易维护和理解如何我么要看或者修改钢材的成本计算我们不用到一堆if-else里面去找具体的代码块我们只需要进去相应的实现类去看就可以代码清晰明了没有其他代码的干扰体现出隔离性我们维护起来也得心应手 3、使用策略模式可以让我们代码变得优美思维能力和架构水平得到提升。
http://www.eeditor.cn/news/120816/

相关文章:

  • wordpress建站邮件大学做视频网站
  • 南京企业网站建设网上购物商城系统论文
  • php网站源码带后台网站建设推广报价单
  • 乌镇镇住房建设局网站分类信息网站模板
  • 网站模板无忧找人做网站网站
  • 临沂网站建设价格低互联网企业解决方案
  • 专业网站公司360免费建站官网
  • 中国建设银行网站的发展汉中软件开发项目管理
  • 做电影类网站收入怎么样做网站需要的东西
  • editplus怎么创网站dede产品展示网站模板
  • 网站的功能需求分析摄影公司
  • 建设通网站上能查到的企业潍坊网站建设工作
  • 专门做spa的网站织梦网站主页代码在后台怎么改
  • 2021年网站有人分享吗旅游自媒体网站怎么做
  • 有哪些招聘网站网络管理系统admin
  • 建设网站建设哪里好黄页信息是什么意思
  • 邢台做网站推广的地方wordpress+手册主题
  • 建设商城网站的难点我想卖东西去哪个网站
  • 如何做教育网站公司部门简称
  • 站长之家psd素材网络组建与安全通知
  • 鞍山市城市建设管理局网站宿州网站建设电话
  • 祥云县住房和城乡建设网站怎么制作网站发布
  • 如何给网站配置域名怎么注册网页
  • 长沙品牌设计公司排行榜开封网站优化
  • 世纪佳缘网站模板线上设计师招聘
  • phpcms资讯类网站模板网络优化工程师实习报告
  • 百度网站验证方法网站建设时如何建立客户信赖感
  • 太原哪里做网站好如何设计一个有趣的网页
  • 网站需备案个人网站logo图片
  • 网站群系统建设标准有关游戏的网站建设规划书