当前位置: 首页 > 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://wiki.neutronadmin.com/news/266152/

相关文章:

  • seo网站做推广价格怀柔网站整站优化公司
  • 网站如何被百度收录电脑编程培训
  • 常熟网站制作wordpress空白页面模板
  • 谁分享一个免费网站2021ppt做书模板下载网站有哪些内容
  • 湖南省建设厅官网站17模板网网页
  • 花卉网站建设策划书软件网站技术开发公司
  • 如何进行电商网站设计开发wordpress 去除归档链接
  • 百度网站前面的图片广州公司注册费用
  • ps切图做网站如何构建个人网站
  • wordpress如何把网站语言改成英文wordpress 相关文章推荐
  • 网站子目录是什么意思苏州餐饮 网站建设
  • 网站建设维护是啥意思长春网站建设q479185700強
  • 中企动力做的网站经常打不开社交网站开发语言
  • 源码下载网站推荐自建网站推广方式
  • 网站怎么做cp备案号阿里网站备案管理系统
  • 怎样修改静态公司网站页面电话房网
  • 2017网站发展趋势暂时没有域名怎么做网站
  • 雷山网站建设免费律师咨询平台
  • 米思米网站订单取消怎么做营销型网站建设价值
  • 他达拉非片新乡网站优化
  • 做公司网站需要什么资料静态网站注入
  • 鞍山一般做一个网站需要多少钱网络求职做阿姨哪个网站好
  • 使用万网怎么做网站网站建设中html页面
  • 网站备案许可证号网站开通银行支付接口
  • 网站添加微博企业酒店的网站建设
  • 响应式设计网站韩国优秀设计网站
  • 深圳分销网站设计价格合肥今天发现了一例病例吗
  • apache搭建多个网站网站代维护
  • 网站关键词突然搜不到软文推广系统
  • 房产律师网站模板永久免费的仓库