策略模式

65 阅读1分钟

why

“策略模式”是前端领域使用率较高的经典设计模式之一

使用该模式需要先定义一系列的算法,把它们封装起来

然后在使用的过程中根据参数来动态的选择算法

其目的是将算法的使用和算法的实现隔离开

使用者对于可变部分的修改和扩展就不会影响到不可变的部分

是让代码保持“开放封闭原则”的一种有效手段

在一定程度上避免多重条件选择

相关代码的聚合度和程序维护性也更高

how

在JS中使用“策略模式”时

通常会将各种策略函数以“键值对”的形式收集到一个对象上

该对象称为“策略对象”

为了避免全局污染,可以使用闭包将策略对象包裹起来,形成一个全局单例

然后对外暴露相应的扩展和修改方法

最后在结算流程中通过动态传入参数调用对应策略

//转换策略单例
Strategies = {
    'String':(rule, value)=>{//...字符串类型的转换处理函数},
    'Number':(rule, value)=>{//...数字类型的转换处理函数},
    'Boolean':(rule, value)=>{//...布尔类型的转换处理函数},
    'Array':(rule, value)=>{//...数组类型的转换处理函数},
    'Placeholder':(rule, value)=>{//...占位符类型的转换处理函数}
    //...其他类型的转换策略
}
//模板转换函数
function parseTemplate(schema = {}){
    let result = {};
    for ( let prop of Object.keys(schema)){
        let [name, rule] = prop.split('|');
        let value = tplObj[prop];
        let type = value.startsWith('@')?
                  'Placeholder':
                   Object.prototype.toString.call(value).slice(8,-1);
        result[name] = Strategies[type](rule, value);
    }
    return result;
}