状态策略模式的优势分析

在项目中用策略模式优雅地处理权限控制这类问题,经常会遇到需要根据不同的状态或条件执行不同逻辑的场景。传统的 if-else 或 switch-case 语句虽然简单直接,但在复杂场景下就会导致代码臃肿、很难维护。我通过一个案例,描述怎样使用状态策略模式来优化这一类问题。

  1. 随着权限类型增加,条件判断也会越来越多
  2. 判断逻辑与执行逻辑高耦合,对应的逻辑分散在各处
  3. 代码可读性和可维护性差
scss 复制代码
function showPart1() {
    console.log(1);
}
function showPart2() {
    console.log(2);
}
function showPart3() { 
    console.log(3);
}
axios.get('xxx').then((res) => {
     if (res == 'boss') {
             showPart1();
             showPart2();
             showPart3();
     } else if(res == 'manner') {
            showPart1();
            showPart2();		 
     } else if(res == 'staff') {
            showPart3();
     }
}) 

在最初的代码实现中,通过 axios 请求获取用户身份后,使用了多层 if-else 判断来执行不同操作: 这里有3个方法,要展示我们的内容,然后我们去发起请求获取当前的一个权限,目前比如我们有3个角色,如果以后有4个,5个或者更多呢,那这个判断就会非常的多。 往下看用状态策略模式实现的方式:

scss 复制代码
function showControl() {
    this.status = '';
    this.power = {
      boss:function() {
            showPart1();
            showPart2();
            showPart3();		  
      },
      manner:function() {
            showPart1();
            showPart2();
      },
      staff:function() {
            showPart3();
      }
    }
 }
showControl.prototype.show = function() {
	 var self = this;
	 axios.get('xxx').then((res) => {
		 self.status = res;
		 self.power[ self.status ]();
	 })
 }
 new showControl().show();

showControl 方法里面要有一个状态,在一个就是策略对象,也就是不同的角色对应着不同的展示方式,最后就是把状态展示出来这一步骤了,show 的方法里面去请求当前的一个权限,改变当前的状态,在根据当前的一个状态从策略对象里拿出对应的策略去展示就好了,这样就完成了当前用户职责不同权限不同展示自己的操作和行为了。对比之前的代码 if-else 分支少了,代码的阅读性也更加优雅了很多,扩展性就很好,更多角色只需要扩展power里这个对象就可以了,这也是状态策略模式带来的一个优化。

相关推荐
0思必得02 小时前
[Web自动化] Selenium处理动态网页
前端·爬虫·python·selenium·自动化
东东5163 小时前
智能社区管理系统的设计与实现ssm+vue
前端·javascript·vue.js·毕业设计·毕设
catino3 小时前
图片、文件的预览
前端·javascript
layman05285 小时前
webpack5 css-loader:从基础到原理
前端·css·webpack
半桔5 小时前
【前端小站】CSS 样式美学:从基础语法到界面精筑的实战宝典
前端·css·html
AI老李5 小时前
PostCSS完全指南:功能/配置/插件/SourceMap/AST/插件开发/自定义语法
前端·javascript·postcss
_OP_CHEN5 小时前
【前端开发之CSS】(一)初识 CSS:网页化妆术的终极指南,新手也能轻松拿捏页面美化!
前端·css·html·网页开发·样式表·界面美化
啊哈一半醒5 小时前
CSS 主流布局
前端·css·css布局·标准流 浮动 定位·flex grid 响应式布局
PHP武器库5 小时前
ULUI:不止于按钮和菜单,一个专注于“业务组件”的纯 CSS 框架
前端·css
电商API_180079052475 小时前
第三方淘宝商品详情 API 全维度调用指南:从技术对接到生产落地
java·大数据·前端·数据库·人工智能·网络爬虫