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

外国人做数学视频网站旅行网站排名

外国人做数学视频网站,旅行网站排名,做网站怎么插音乐循环,企业门户网站用户类型前言 策略模式是平时Java开发中常用的一种,虽然已有很多讲解设计模式的文章,但是这里还是写篇文章来从自己理解的角度讲解一下。 使用场景 我们不妨进行场景假设,要对我们的软件进行授权管理:在启动我们的软件之前先要校验是否…

前言

策略模式是平时Java开发中常用的一种,虽然已有很多讲解设计模式的文章,但是这里还是写篇文章来从自己理解的角度讲解一下。

使用场景

我们不妨进行场景假设,要对我们的软件进行授权管理:在启动我们的软件之前先要校验是否存在合法的授权,如果授权不合法则要求用户进行激活操作。作为例子,我们就简单地实现一下授权校验功能:分发的授权文件中内容是一个四位随机数,并且最后一位是数字且为0。我们只要校验授权文件中内容的最后一位是数字0即可。

public class LicenseService {public boolean checkLicense() {boolean result = false;// abc0File file = Path.of("./secret").toFile();String content = "";try{// 读取文件内容BufferedReader br = new BufferedReader(new FileReader(file));content = br.readLine();br.close();}catch(Exception e){e.printStackTrace();}// 末尾字符是0即认为校验通过if (content.endsWith("0")) {result = true;}return result;}
}

需求变更

现在需求进行了变更,不再校验末尾字符为0了,而是校验开头字符是0,因此我们需要对程序进行修改。并且,我们在调整程序的过程中将读取文件内容和授权校验的逻辑进行分离,将授权校验的逻辑抽到一个单独的方法中。

public boolean checkLicense() {...result = checkInternal(content, result);...}private static boolean checkInternal(String content, boolean result) {if (content.startsWith("0")) {result = true;}return result;}

改完之后又接到了最新通知,还有可能改回原来末尾字符的判断方式,于是我们又对方法进行了调整。通过方法传入一个参数来决定使用哪种方式判断:

public boolean checkLicense() {...result = checkInternal(content, result, 1);...}private static boolean checkInternal(String content, boolean result, int choose) {// 通过方法传入的choose来决定使用哪种算法if (choose == 0) {if (content.endsWith("0")) {result = true;}} else if (choose == 1) {if (content.startsWith("0")) {result = true;}}return result;}

策略模式

上面我们的例子是比较简单的,但是达到了演示的效果:校验授权的实现可能有多个版本,并且不同版本的实现都有可能被使用。为了后续方便扩展和维护,我们把checkInternal方法中的两个if判断中的逻辑再抽离出来。

首先定义一个策略接口:

public interface CheckStrategy {boolean check(String content);
}

然后将两个if中的逻辑转到接口的实现类中:

public class CheckStart implements CheckStrategy {@Overridepublic boolean check(String content) {boolean result = false;if (content.startsWith("0")) {result = true;}return result;}
}
public class CheckEnd implements CheckStrategy {@Overridepublic boolean check(String content) {boolean result = false;if (content.endsWith("0")) {result = true;}return result;}
}

接下来再调整一下LicenseService中方法的调用,把原来的checkInternal方法中的if语句进行调整,改为调用CheckStrategy中的方法:

public boolean checkLicense() {...result = checkInternal(content, new CheckStart());...
}private static boolean checkInternal(String content, CheckStrategy strategy) {return strategy.check(content);
}

更多思考

有说一种对于策略的说法是替换满屏的if else,我认为这不能算是策略模式的使用目的,只能算是应用了策略模式后的副产物。

它更多的使用场景是这样:有某一大方法,其中的一个环节可以有不同实现,并且进行环节的算法替换时不影响原大方法的功能(或受到预期的控制)。这里再举一些应用场景的例子,不够精准但重在体会其中的思想:

  • 实现游戏可以用不同的底层引擎,引擎之间的替换可以应用策略模式
  • 程序和数据库交互时可能用到不同的数据库产品如mysql、sqllite,对不同数据库的交互操作可以应用策略模式
  • 别的我暂时想不起来了

Spring中实战

现在java web应用里Spring算是事实上的标准了,在Spring中用策略模式还是有一些小技巧的。下面直接给出代码请同学们品。

@Service
public class LicenseService {// 注入strategy manager@Autowiredprivate StrategyManager strategyManager;public boolean checkLicense() {boolean result = false;// abc0File file = Path.of("./secret").toFile();String content = "";try {// 读取文件内容BufferedReader br = new BufferedReader(new FileReader(file));content = br.readLine();br.close();} catch (Exception e) {e.printStackTrace();}// 由manager作为策略类实现的提供者result = strategyManager.pickCheckStrategy(CheckStrategyEnum.START.toString()).check(content);return result;}
}
@Service
public class StrategyManager {// 注入CheckStrategy list@Autowiredprivate List<CheckStrategy> checkStrategyList;public CheckStrategy pickCheckStrategy(String type) {// 根据传入的type从上面list中取出对应的策略实现类并返回给调用者return checkStrategyList.stream().filter(s -> s.type().equals(type)).findFirst().orElseThrow();}
}enum CheckStrategyEnum {END, START;
}
public interface CheckStrategy {/*** 返回策略实现类的类型,用于为manager提供实现类的标识** @return 自定义的枚举类型 {@link CheckStrategyEnum}*/String type();/*** 判断授权。算法由实现类确定** @param content 判断的内容* @return 是否判断成功*/boolean check(String content);
}
@Service
public class CheckStart implements CheckStrategy {@Overridepublic String type() {// 返回对应的枚举typereturn CheckStrategyEnum.END.toString();}@Overridepublic boolean check(String content) {boolean result = false;if (content.startsWith("0")) {result = true;}return result;}
}
@Service
public class CheckEnd implements CheckStrategy {@Overridepublic String type() {// 返回对应的枚举typereturn CheckStrategyEnum.START.toString();}@Overridepublic boolean check(String content) {boolean result = false;if (content.endsWith("0")) {result = true;}return result;}
}
http://www.yidumall.com/news/33050.html

相关文章:

  • 创建个网站需要多少钱深圳外贸网络推广渠道
  • 望牛墩镇做网站百度竞价推广方案
  • 动态网站开发实训报告1优化教程网官网
  • 网站导航栏 字体有效果的网站排名
  • 应用商店下载安装打开长沙优化排名
  • 西安网站开发外包中国的网络营销公司
  • 上海网站建设专业公司排名免费crm
  • 重庆的网站建设公司应用商店aso优化
  • 湘潭网站建站公司优化设计答案六年级
  • 易语言可以做网站嘛网页优化包括什么
  • 厦门市建设局查询保障摇号网站首页新闻发布平台有哪些
  • 重庆公司直招站长工具seo综合查询网
  • 所有娱乐场网址平台安卓优化大师旧版本下载
  • 河北雄安建设投资集团网站百度网站优化公司
  • 网站建设咨询公线下推广宣传方式有哪些
  • 全屏展示网站图片如何做自适应餐饮店如何引流与推广
  • 加强主流网站集群传播能力建设个人网站模板
  • 天津网上办事seo如何优化关键词
  • webstation做网站武汉建站公司
  • 做外贸网站的价格域名seo站长工具
  • 上海网站开发方案打开浏览器直接进入网站
  • 企业网站系统设计与实现唐山公司做网站
  • 某企业网站的设计与实现抖音推广
  • 建设银行网站怎么先无贷款呢seo资讯
  • 起点数据网是谁做的网站五年级下册数学优化设计答案
  • 怎么建设商品网站谷歌排名
  • 中国建设部网站安全b证查询产品推广图片
  • 如何低成本做网站推广成都网站建设技术支持
  • 手机网站排名优化百度投诉中心24人工 客服电话
  • 点击一个网站跳转到图片怎么做优化网站排名解析推广