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

十大网络平台茶叶seo网站推广与优化方案

十大网络平台,茶叶seo网站推广与优化方案,怎么开发一个自己的网站,装修案例图片设计模式之策略模式实践 先了解一下策略模式的定义是什么?解决什么问题 策略模式是一种行为设计模式,它定义了一系列算法,将每个算法封装成一个类,并使它们可以互相替换。策略模式允许客户端在运行时从可互换的算法中选择一个&a…

设计模式之策略模式实践

先了解一下策略模式的定义是什么?解决什么问题

策略模式是一种行为设计模式,它定义了一系列算法,将每个算法封装成一个类,并使它们可以互相替换。策略模式允许客户端在运行时从可互换的算法中选择一个,而不必修改使用它们的代码。这模式提供了一种将算法独立于客户端而变化的方式。

策略模式主要包含以下几个角色:

  1. Context(上下文): 持有一个策略对象的引用,负责将具体的算法委托给策略对象执行。
  2. Strategy(策略): 定义了一个算法族的接口,所有具体策略类都必须实现该接口。这个接口通常只包含一个方法,即算法的执行方法。
  3. ConcreteStrategy(具体策略): 实现了策略接口的具体算法类。每个具体策略类都封装了一个特定的算法。

使用场景:

  • 当一个系统中有许多类,它们之间的区别仅在于它们的行为时,可以使用策略模式,将行为抽象为一个接口,然后为每个具体行为实现一个策略类。
  • 当一个类定义了多种行为,并且这些行为在该类的操作中以多个条件语句的形式出现时,可以考虑使用策略模式,将每个条件分支的实现封装到具体策略类中。
  • 当一个系统需要动态地在几种算法中选择一种时,可以使用策略模式,使得客户端可以根据需要切换算法。

策略模式的优点包括:

  • 提供了一种替代继承的方式,避免了使用多重条件语句来选择算法。
  • 将算法的实现细节与客户端分离,使得算法的变化不会影响到使用算法的客户端。

总之,策略模式使得算法的变化独立于使用算法的客户端,提高了系统的灵活性和可维护性。

理论讲完了进入正题👇

实践

当我们学习完设计模式的时候,是不是总是想不出如何将设计模式运用到自己的项目中,那么下面就使用一个我在项目中遇到的问题,并使用设计模式对代码进行优化

简单功能介绍:项目有一个每日领取积分的功能,想根据不同的用户身份每日领取不同的积分

在这里插入图片描述

每日领取积分(未优化前)

ThrowUtils.throwIf(loginUser == null, ErrorCode.NOT_LOGIN_ERROR);
// 查询当前用户今日是否已经获取
QueryWrapper<RewardRecord> qw = new QueryWrapper<>();
Long userId = loginUser.getId();
LocalDateTime now = LocalDateTime.now();
List<RewardRecord> rewardRecords = rewardRecordMapper.judgeTodayHasAdd(userId, now);
if (!rewardRecords.isEmpty()) {throw new BusinessException(ErrorCode.OPERATION_ERROR, "今日已领取");
}
RewardRecord rewardRecord = new RewardRecord();
rewardRecord.setRewardPoints(RewardRecordConstant.DAY_FREE_NUM);
rewardRecord.setUserId(loginUser.getId());
boolean save = this.save(rewardRecord);
ThrowUtils.throwIf(!save, ErrorCode.SYSTEM_ERROR);
UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<>();
// 获取积分
userUpdateWrapper.eq("id", loginUser.getId()).setSql("totalRewardPoints = totalRewardPoints + " + RewardRecordConstant.DAY_FREE_NUM);
boolean update = userService.update(userUpdateWrapper);
ThrowUtils.throwIf(!update, ErrorCode.SYSTEM_ERROR);
return true;

原来领取的积分是写死的,现在有个新的需求,VIP每日可以获取20积分, SVIP每日可以获取40积分

想要实现上面的需求,怎么做?

大部分人下意识想到下面的实现方法

User user = getUserInfo();
if(user == 用户) {// ...
} else if(user == vip) {// ...
} else if(user == svip) {//...
}

难道我们要写这么多的if else吗?假如我之后还要加另外的角色呢?再往上面写if else吗?那就不太体面

其实我们完全可以使用策略模式,策略模式其实就是用来优化这种多分支情况

不同的情况对应不同的处理策略

话不多说,我们以上面每日领取积分的案例看一下策略模式怎么应用上

在这里插入图片描述

  1. 首先我们要定义一个写一个策略的接口(RoleService),每一个策略实现类都要实现这个策略接口

    /*** @Author:HWQ* @DateTime:2023/11/13 20:31* @Description: 角色策略接口**/
    public interface RoleService {/*** 判断是否是当前角色* @return*/boolean isCurrentRole(String userType);/*** 获取每日积分的数量* @return*/Integer getDayReward();/*** 获取最大的Token数* @return*/Integer getMaxToken();/*** 获取图表保存天数* @return*/Integer getChartSaveDay();/*** 获取对话保存信息* @return*/Integer getChatSaveDay();
    }
    
  2. 编写策略实现类

    // 普通用户
    @Service
    public class NormalUserService implements RoleService {@Overridepublic boolean isCurrentRole(String userType) {ThrowUtils.throwIf(StringUtils.isEmpty(userType), ErrorCode.PARAMS_ERROR);return UserRoleEnum.USER.getValue().equals(userType);}@Overridepublic Integer getDayReward() {return 10;}@Overridepublic Integer getMaxToken() {return 2048;}@Overridepublic Integer getChartSaveDay() {return 10;}@Overridepublic Integer getChatSaveDay() {return 10;}
    }
    
    // vip用户
    @Service
    public class VIPUserService implements RoleService {@Overridepublic boolean isCurrentRole(String userType) {ThrowUtils.throwIf(StringUtils.isEmpty(userType), ErrorCode.PARAMS_ERROR);return UserRoleEnum.VIP.getValue().equals(userType);}@Overridepublic Integer getDayReward() {return 20;}@Overridepublic Integer getMaxToken() {return 2048;}@Overridepublic Integer getChartSaveDay() {return 30;}@Overridepublic Integer getChatSaveDay() {return 30;}
    }
    
  3. 在需要进行角色判断的地方注入策略Service

在这里插入图片描述

总结:如果你的代码中 if…else 难以维护,可以考虑使用策略模式进行优化

如果你觉得这篇文章对你有帮助,可以关注一下,后续会发更多的设计模式实践案例🫡,Happy coding🚀

http://www.yayakq.cn/news/426493/

相关文章:

  • 做网站哪个便宜外贸论坛有哪些平台
  • 制作自助网站wordpress批量alt代码
  • 免费培训班报名官网商丘做网站公司新站seo快速收录网页内容页的方法
  • 哪些网站可以做邀请函上海网页制作费用
  • dw网页设计软件的学习网站做58同城这样的网站有哪些
  • 哪个网站做的简历最好wordpress 主页地址
  • 云南网站建设公司排名国家市场监督管理
  • 西安网站建设ruiqinetwordpress模板外贸
  • 台州市建设厅网站建设工程造价管理协会网站
  • 阿里云怎样做公司网站东莞哪里有做网站的
  • 搜索引擎友好的网站有哪些特点太仓市住房城乡建设局网站
  • 网站还没上线怎么做品牌推广南昌网站建设报价
  • 网站建设代理费用微信小程序开发实例教程
  • 做游戏网站有钱赚吗wordpress百度云cdn
  • 江苏省住房城乡建设厅官方网站中国建设官方网站首页
  • 企业网站完整版我想做个网站怎么做 找谁做好
  • 高品质外贸网站建设丽水网站seo
  • 浙江标力建设集团网站泉州模板开发建站
  • 城乡建设规划网站郑州seo培训
  • 建网站怎么分类企业网站建设及推广
  • 企业网站策划书下载大连装修公司
  • 回龙观手机网站建设服务黄骅港鑫海化工招聘
  • 上海网站se0优化站长素材官网免费
  • 优秀的网站建设网站的制作成品
  • 锦州网站建设最低价网站内容管理系统使用说明书
  • 东莞制作网站公司哪家好php服装网站模板
  • 网站页数网站建设分金手指专业五
  • 分析网站的优势和不足建个网站的费用
  • 网站模板建网站外发加工网正规吗安全吗
  • 关于插画的网站怎样做免费的网站推广