JavaScript设计模式之策略模式

所谓“条条道路通罗马”,在现实中,为达到某种目的往往不是只有一种方法。比如挣钱养家:可以做点小生意,可以打分工,甚至还可以是偷、抢、赌等等各种手段。在程序语言设计中,也会遇到这种类似的情况,要实现某种功能可以有多种方案选择。比如,在很多地图类软件上,你想从A地点到达B地点时,为你提供几种交通工具的选择,可以查看每种交通工具的所需费用和时间。在程序语言设计中,把这种设计模式叫做策略模式。

 

策略模式的定义:策略模式是指对一系列的算法定义,并将每一个算法封装起来,而且使它们还可以相互替换。

 

主要解决问题:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护。

 

从上面两点可以知道,策略模式是通过定义一系列的算法,并对其进行封装,使其可以相互替换使用,目的是消除多层if...else语句嵌套的问题。这里的定义一系列的算法的意思是:你可以将每一种方案封装成函数或者是类的形式。

先看个输出今天是星期几的例子:

复制代码
//获取当天是星期几函数
function getDay(day){
    if(day === 0){
        console.log('今天是星期日');
    }
                
    if(day === 1){
        console.log('今天是星期一');
    }
                
    if(day === 2){
        console.log('今天是星期二');
    }
                
    if(day === 3){
        console.log('今天是星期三');
    }
                
    if(day === 4){
        console.log('今天是星期四');
    }
                
    if(day === 5){
        console.log('今天是星期五');
    }
                
    if(day === 6){
        console.log('今天是星期六');
    }
};
            
var day = new Date().getDay();
            
getDay(day);
复制代码

 

上面的代码完全正常,使用起来一点问题都没有,但不易于维护。用策略模式重构上面的代码:

复制代码
//定义策略类
var Strategies = (function(){
                
    function A(){
        console.log('今天是星期一');
    };
                
    function B(){
        console.log('今天是星期二');
    };
                
    function C(){
        console.log('今天是星期三');
    };
                
    function D(){
        console.log('今天是星期四');
    };
                
    function E(){
        console.log('今天是星期五');
    };
                
    function F(){
        console.log('今天是星期六');
    };
                
    function G(){
        console.log('今天是星期日');
    };
                
    return {
        getDay1: A,
        getDay2: B,
        getDay3: C,
        getDay4: D,
        getDay5: E,
        getDay6: F,
        getDay0: G
    }

})();
            
//展示当天是星期几的函数
function alertWeekDay(){
    var d = new Date().getDay();
                
    //根据变量d选择调用Strategies类的方法
    Strategies["getDay" + d]();
};

alertWeekDay();
复制代码

 

大伙看到这段代码的时候,是否认为上面的代码比这个用什么策略模式的简洁的多了去了?从代码量的角度看,确实是这样。但现实是,作为开发者我们有80%的时间是在维护旧的代码,剩下的20%才是写新的代码,所以写出可维护的代码同样很重要。改用策略模式后的代码虽然代码量增加了,但更易于维护了。为什么更容易维护了呢?假如某一天W3C把Date对象的getDay()函数改成为从0~6分别对应星期一到星期日(而不是现在的0表示星期日,1~6分别对象星期一到星期六),第一段用if写的代码是不是要把所用if结构的代码都要改一遍,但第二段代码只需修改Strategies类里return的对象的方法顺序即可,那个更易于维护一眼便知。

 

当然上面是基于面向对象的方式使用的策略模式,大家都知道JavaScript没有类的概念,所以上面不是正在意义上的JavaScript语言策略模式。在JavaScript中,函数是一等对象,可以将函数当作一个变量传递到函数内部执行,所以JavaScript语言是天生自带策略模式的哦!下面看看真正的JavaScript语言策略模式:

复制代码
function getDay0(e){
    console.log('今天是星期日:' + e);
};
            
function getDay1(e){
    console.log('今天是星期一:' + e);
};
            
function getDay2(e){
    console.log('今天是星期二:' + e);
};
            
function getDay3(e){
    console.log('今天是星期三:' + e);
};
            
function getDay4(e){
    console.log('今天是星期四:' + e);
};
            
function getDay5(e){
    console.log('今天是星期五:' + e);
};
            
function getDay6(e){
    console.log('今天是星期六:' + e);
};
            
//展示备忘事件函数
function alertRemindEvents(fn, events){
     fn(events);
};
            
alertRemindEvents(getDay3, "今天中午妈妈没时间做饭,我要自己去买菜做饭了。");
复制代码

 

策略模式的优缺点:

优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。

缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。

 

posted @   雨霖月寒  阅读(435)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示