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

新乡专业做淘宝网站房地产平面设计网站

新乡专业做淘宝网站,房地产平面设计网站,做电子签章登录那个网站,门户类网站图片你还在大篇幅的使用if…else吗#xff1f; 举个例子#xff1a;比如你们有一个订单系统#xff0c;用户在平时下单和在双11的时候下单的时候逻辑是不一样的#xff0c;可能双11下单就涉及到一些优惠之类的#xff0c;这个时候你怎么做#xff0c;应该有好多同学是这样做…你还在大篇幅的使用if…else吗 举个例子比如你们有一个订单系统用户在平时下单和在双11的时候下单的时候逻辑是不一样的可能双11下单就涉及到一些优惠之类的这个时候你怎么做应该有好多同学是这样做的前端传一个参数来区分普通下单和双11下单后台用if else来判断两个分支来处理逻辑那这样好像也没啥问题但是后面到双12了老板说双12优惠力度又不一样了你又得加一个else 然后还需要修改之前已经测试没问题的代码 这样你这个代码块还需要重新测试而且整体的代码简洁度也不美观了 那有什么最优的办法呢那就是使用策略模式 本篇文章将通过策略模式的概念和优缺点以及几个完整的示例来讲解如何在工作和学习当中将策略模式融入的你的业务当中 一、什么是策略模式 策略模式是一种设计模式它定义了一系列算法并将每一个算法封装起来使它们可以相互替换。这种模式的主要目的是解决在有多种算法相似的情况下使用“if…else”所带来的复杂和难以维护的问题。 1.1 策略模式的优点 策略模式的优点有 提供了管理相关的算法族的办法策略模式的等级结构定义了一个算法或行为族恰当使用继承可以把公共的代码移到抽象策略类中从而避免重复的代码。提供了可以替换继承关系的办法如果不使用策略模式那么使用算法的环境类就可能会有一些子类每一个子类提供一种不同的算法。但是这样一来算法的使用就和算法本身混在一起不符合“单一职责原则”决定使用哪一种算法的逻辑和该算法本身混合在一起从而不可能再独立演化而且使用继承无法实现算法或行为在程序运行时的动态切换。使用策略模式可以避免多重条件选择语句使用策略模式可以避免在多个地方使用“if-else”或“switch-case”语句来根据不同的条件选择不同的算法或行为。提供了对“开闭原则”的完美支持用户可以在不修改原有系统的基础上选择算法或行为也可以灵活地增加新的算法或行为。简化了单元测试因为每个算法都有自己的类可以通过自己的接口单独测试。 总之策略模式是一种通过封装算法和行为来简化复杂系统设计的模式它允许在运行时根据需要动态地选择不同的策略实现。 1.2策略模式的使用场景 策略模式适用于以下场景 针对同一类型问题的多种处理方式仅仅是具体行为有差别时。需要安全地封装多种同一类型的操作时。出现同一抽象类有多个子类而又需要使用 if-else 或者 switch-case 来选择具体子类时。多个类只有在算法或行为上稍有不同的情况下。算法需要自由切换的情况下。需要屏蔽算法规则对客户端造成的影响时例如减少 if…else 语句时。当一个类有多种行为方式时可以使用策略模式来动态地选择行为方式。 1.3 策略模式和工厂模式的区别 有些同学经常把策略模式和工厂模式弄混那我们也来看看策略模式和工厂模式的区别 用途工厂模式的主要作用是创建对象而策略模式的主要作用是让一个对象在许多行为中选择一种行为。关注点工厂模式关注的是对象的创建而策略模式关注的是行为的封装。传参工厂模式的传参是一个类型而策略模式的传参是一个对象。适用场景工厂模式主要应用在多数据库选择、类库文件加载等场景中而策略模式则适用于策略的切换与扩展定义策略族分别封装起来让他们之间可以相互替换。 总结来说工厂模式和策略模式虽然相似但它们的设计理念和适用场景有所不同。工厂模式注重创建对象而策略模式注重行为的封装和算法的独立性。因此在使用时需要根据具体需求选择合适的模式。 二、策略模式的简单示例 下面以一个简单的代码示例来演示策略模式 // 定义一个接口 public interface Strategy { void execute(); } // 两个实现类分别实现这个接口 public class StrategyA implements Strategy { Override public void execute() { // 第一段逻辑 System.out.println(执行第一段逻辑); } } public class StrategyB implements Strategy { Override public void execute() { // 第二段逻辑 System.out.println(执行第二段逻辑); } } public class Context { private Strategy strategy; public Context(Strategy strategy) { this.strategy strategy; } public void setStrategy(Strategy strategy) { this.strategy strategy; } public void executeStrategy() { strategy.execute(); } } public class Main { public static void main(String[] args) { Context context new Context(new StrategyA()); // 设置执行第一段逻辑的策略 context.executeStrategy(); // 执行策略输出 执行第一段逻辑 context.setStrategy(new StrategyB()); // 更换为执行第二段逻辑的策略 context.executeStrategy(); // 执行策略输出 执行第二段逻辑 } }在上面的示例中我们定义了一个Strategy接口其中包含一个execute方法用于执行相应的逻辑。然后我们创建了两个实现了Strategy接口的类StrategyA和StrategyB分别表示第一段逻辑和第二段逻辑。 我们还定义了一个Context类它持有一个Strategy对象并提供了一个executeStrategy方法来执行相应的策略。客户端代码可以通过设置不同的策略对象来决定执行哪一段逻辑。在示例中我们创建了一个Context对象并使用StrategyA作为初始策略来执行第一段逻辑。然后我们通过调用setStrategy方法更换为StrategyB来执行第二段逻辑。 三、策略模式和业务的结合 相信好多同学光看上面的代码可能还不知道怎么将策略模式应用到自己的代码当中那下面就给出一个个示例本人实际上过生产的项目 ps: 以下代码都是我模拟的生产代码因为生产的不能公开哦 3.1 登录认证 登录认证想必大家都不陌生那我们的项目可能就会对应几种认证方式可能会是账号密码、验证码、扫码等等 下面我就实现两种认证方式来演示策略模式 3.1.1 首先创建一个认证的接口 /*** 统一认证接口** author jiagang*/ public interface ITokenGranter {/*** 用户认证** param tokenParameter 授权参数* return UserInfo*/UserInfo grant(TokenParameter tokenParameter);}3.1.2 分别创建账号密码登录和验证码登录的类 创建两个类分别实现ITokenGranter接口 账号密码实现 Component AllArgsConstructor public class PasswordTokenGranter implements ITokenGranter {public static final String GRANT_TYPE password;private IUserService userClient;Overridepublic UserInfo grant(TokenParameter tokenParameter) {// 下面逻辑简单模拟了就String account tokenParameter.getAccount();String password tokenParameter.getPassword();// 通过账号和密码解密后来查询用户 -- userClient为调用用户服务的能力return userClient.userInfo(account, DigestUtil.encrypt(password));}}验证码实现 Component AllArgsConstructor public class CaptchaTokenGranter implements ITokenGranter {public static final String GRANT_TYPE captcha;private IUserService userClient;private RedisUtil redisUtil;Overridepublic UserInfo grant(TokenParameter tokenParameter) {HttpServletRequest request WebUtil.getRequest();String key request.getHeader(TokenUtil.CAPTCHA_HEADER_KEY);String code request.getHeader(TokenUtil.CAPTCHA_HEADER_CODE);// 获取验证码String redisCode String.valueOf(redisUtil.get(CacheNames.CAPTCHA_KEY key));// 判断验证码if (code null || !StringUtil.equalsIgnoreCase(redisCode, code)) {throw new ServiceException(TokenUtil.CAPTCHA_NOT_CORRECT);}// 下面逻辑简单模拟了就String account tokenParameter.getAccount();String password tokenParameter.getPassword();// 通过账号和密码解密后来查询用户 -- userClient为调用用户服务的能力return userClient.userInfo(account, DigestUtil.encrypt(password));}}3.1.3 创建一个Builder 这个类的作用是通过授权方式grantType来确定使用哪个实现类 AllArgsConstructor public class TokenGranterBuilder {/*** TokenGranter缓存池*/private static final MapString, ITokenGranter GRANTER_POOL new ConcurrentHashMap();static {GRANTER_POOL.put(PasswordTokenGranter.GRANT_TYPE, SpringUtil.getBean(PasswordTokenGranter.class));GRANTER_POOL.put(CaptchaTokenGranter.GRANT_TYPE, SpringUtil.getBean(CaptchaTokenGranter.class));}/*** 获取TokenGranter** param grantType 授权类型* return ITokenGranter*/public static ITokenGranter getGranter(String grantType) {// password 为默认授权类型ITokenGranter tokenGranter GRANTER_POOL.get(toStr(grantType, PasswordTokenGranter.GRANT_TYPE));if (tokenGranter null) {throw new SecureException(no grantType was found);} else {return tokenGranter;}}public static String toStr(Object str, String defaultValue) {return null str ? defaultValue : String.valueOf(str);}}3.1.4 controller调用 RestController AllArgsConstructor RequestMapping(/auth) public class AuthController {private IAuthService authService;private RedisUtil redisUtil;/*** 登陆认证*/PostMapping(login)public RUserInfo token(RequestBody TokenParameter tokenParameter) {// 通过类型获取不同实现类的认证ITokenGranter granter TokenGranterBuilder.getGranter(tokenParameter.getGrantType());// 调用接口UserInfo userInfo granter.grant(tokenParameter);if (userInfo null || userInfo.getUser() null || userInfo.getUser().getId() null) {return R.fail(TokenUtil.USER_NOT_FOUND);}return R.data(userInfo);}}内容结束啦最后送大家一句话 白驹过隙沧海桑田 文章持续更新可以关注下方公众号或者微信搜一搜「 最后一支迷迭香 」获取项目源码第一时间阅读获取更完整的链路资料。
http://www.zqtcl.cn/news/211685/

相关文章:

  • 三亚谁做网站做网站导航的
  • 厦门酒店网站建设建设网站文案
  • 17网站一起做网店质量怎么样合肥网站建设维护
  • 建站公司外包怎么搭建手机网站m
  • 用ps做网站设计济南品牌网站制作便宜
  • 个人可做网站需要什么材料可以做3d电影网站
  • 温州网站建设专家网站推广软件推广
  • 24淘宝网站建设编程做网站
  • 公司网站模板怎么做自适应网站设计尺寸
  • 滨州正规网站建设价格简单网站制作
  • 创建网站平台电商系统源码
  • 滕州本地网站建设网站维护中模版
  • 商城类网站设计制作开发公司 张庆
  • seo擦边球网站宝安网站制作
  • 文山北京网站建设wordpress漂亮破解主题
  • 做网站需要什么证明嘛wordpress和自己写
  • 蚌埠市网站建设公司网站建设 技术 哪些
  • 网站收录查询临沂seovisual c 网站开发
  • 国际空间站vs中国空间站做网站在哪里接活
  • 怎样宣传网站营销外包公司
  • 工程网站模板制作教程具有价值的专业网站建设平台
  • 用wex5可以做网站吗邯郸seo快速排名
  • 高端品牌网站建设兴田德润可信赖网络运营方案怎么写
  • 新公司网站建设合肥关键词排名优化
  • 网站排名优化+o+m西安网络推广平台公司
  • 找网站建设公司需要注意什么常州网站建设公司好么
  • 不备案的网站很慢网站双线主机优势
  • 南京电子商务网站建设23个营销专业术语
  • 建设银行官网官方网站学习网页制作的网站
  • 开发网站需要什么硬件今年最流行的装修风格