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

如何建设网站并与数据库相连thinkphp做视频网站

如何建设网站并与数据库相连,thinkphp做视频网站,家装公司官网,宁波seo推广优化一、什么是策略模式 策略模式是一种行为设计模式#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.yutouwan.com/news/266152/

相关文章:

  • 广州网站程序开发艺术字体设计网
  • 新能源网站建设重庆工程造价信息2021
  • 农用地转建设用地结果查询网站wordpress多媒体导入
  • 嘉兴做网站建设的公司哪家好网站建站平台系统
  • 邢台建网站哪里有担路网口碑做网站好吗
  • 做it的在哪个网站找工作男女做羞羞完整版网站
  • 网站产品图怎么做的访问网站慢
  • 网站开发背景论文网站如何做触屏滑动
  • 好的平面网站模板知春路网站建设
  • 网站开发作为固定资产怎么摊销3 阐述网站建设的步骤过程 9分
  • 网站建设准备工作总结网店代运营服务
  • 松原建设小学网站WordPress黑镜主题下载
  • 网站正在建设中提示页面深圳网站建设需要多少费用
  • 河南省建设厅注册中心网站如何将自己 做的网站发布网上
  • 建设厅电工证查询网站四川网站建设套餐
  • 产品网站策划书方案做视频网站推广挣钱吗
  • 潍坊视频类网站建设网站公司怎么建站
  • 电商网站开发周期看空间
  • 大兴模版网站建设哪家好个人电影网站建设
  • 内江市规划建设教育培训中心网站宁波市网站建设制作费用
  • 新乡网站建设专业熊掌网络做导购网站要多少钱
  • 商业网站 模板wordpress 标题入库
  • 成都网站系统开发大通证券手机版下载官方网站下载
  • 教育网站开发用例图三类人员 网站开发
  • 网站建设公司咨html编辑器安卓版下载
  • wordpress网站正在建设中网站开发 实名认证需要备案吗
  • 建站报价怎么做淘宝网站的网页
  • 淘宝客网站做seo有用吗公司申请网站建设
  • 数据统计网站淄博网站建设卓迅网络
  • 设计出色的网站网站规划详细设计怎么写