策略模式:定义一系列的算法,把它们一个个封装起来,并且使它们可以互相替换。封装的策略算法一般是独立的,策略模式根据输入来调整采用哪个算法。关键是策略的实现和使用分离。
实际中的应用
- 表格 formatter
Element 的表格控件的 Column 接受一个formatter
参数,用来格式化内容,其类型为函数,并且还可以接受几个特定参数,像这样:Function(row, column, cellValue, index)
。
以文件大小转化为例,后端经常会直接传 bit 单位的文件大小,那么前端需要根据后端的数据,根据需求转化为自己需要的单位的文件大小,比如 KB/MB。
实现文件计算的方法:
export const unitConvert = {
/* 将文件大小(bit)转化为 KB */
bitToKB: val => {
const num = Number(val)
return isNaN(num) ? val : (num / 1024).toFixed(0) + 'KB'
},
/* 将文件大小(bit)转化为 MB */
bitToMB: val => {
const num = Number(val)
return isNaN(num) ? val : (num / 1024 / 1024).toFixed(1) + 'MB'
}
}
/* 生成el表单 formatter */
const unitConvertFn = function(type, rowKey){
return function(row, column, cellValue, index){
return unitConvert[type](row[rowKey])
}
}
export default unitConvertFn
组件中使用
<template>
<el-table :data="tableData">
<el-table-column prop="date" label="日期"></el-table-column>
<el-table-column prop="name" label="文件名"></el-table-column>
<!-- 进行调用-->
<el-table-column prop="sizeKb" label="文件大小(KB)"
:formatter='unitConvertFn("bitToKB", "sizeKb")'>
</el-table-column>
<el-table-column prop="sizeMb" label="附件大小(MB)"
:formatter='unitConvertFn("bitToMB", "sizeMb")'>
</el-table-column>
</el-table>
</template>
<script type='text/javascript'>
import unitConvertFn from './unitConvertFn.js'
export default {
data() {
return {
unitConvertFn,
tableData: [
{ date: '2022-11-28', name: '文件1', sizeKb: 1234, sizeMb: 1133427 },
{ date: '2022-11-28', name: '文件2', sizeKb: 4213, sizeMb: 7535162 }]
}
}
}
</script>
策略模式优缺点
-
优点
1.策略之间相互独立,但策略可以自由切换,提高代码复用率
2.避免过多的判断
3.可扩展性好,策略可以很方便的进行扩展 -
缺点
1.复杂的逻辑无法共享,造成资源浪费
2.使用之前需要了解实现的逻辑,增加了使用成本
网友评论