js --策略模式

策略模式的定义:算法

将算法一个个的单独进行封装,而且使他们能够相互替换。此模式让算法的变化不会影响到使用算法的客户。this

 先回顾一下,咱们在作项目的过程当中,是否是常常会碰见由于业务逻辑的关系,咱们会写好多的is-else语句进行判断,或者使用switch语句,在后期添加新的需求的时候,比较头疼的须要去改这些判断语句,并且有时候会,添加一条判断语句,一不当心会致使全部的判断都失效呢?举一个以前项目中用到的例子把,简化一下。有一个按钮在不一样的条件下,跳转到不一样的页面,以下:url

toseeHouse() {
            switch(this.activeIndex){
                case 0:uni.navigateTo({
                            url: '/0'
                        });
                    break;
                case 1:uni.navigateTo({
                            url: '/1'
                        });
                    break;
                case 2:uni.navigateTo({
                            url: '/2'
                        });
                    break;
                case 3:uni.navigateTo({
                            url: '/3'
                        });
                    break;
            }
        },

这段代码带来的问题主要是在增长新的需求的时候,咱们还须要修改这段代码的总体逻辑。spa

而后根据策略模式,咱们将一系列的算法单独封装出去,使用哪一个,调用哪一个方法。prototype

JavaScript版本的策略模式设计

let obj = {
        '0': function() {
            return '0'
        },
        '1': function() {
            return '1'
        },
        '2': function() {
            return '2'
        }
    }
    console.log('111111111', obj['0']()) //0

这样,就避免了if-else 语句的判断,若是增长了新的业务逻辑,咱们能够直接修改算法,而不会影响用户的使用。code

使用策略模式重构代码,能够消除程序中大片的条件分支语句。在实际开发的过程当中,咱们一般会把算法的含义扩散开来,是策略模式也能够封装一系列的“业务规则”。只要这些业务规则的指向的目标一致,而且能够被替换使用,咱们就可使用策略模式来封装他们。orm

在举一个在网上看到的例子,应该算是比较经典的把,由于 好多博客中都以这个例子为例,就是计算奖金的这个例子。对象

传统版的策略模式:blog

 var performanceA = function() {

    }
    performanceA.prototype.calculate = function(salary) {
        return salary*4;
    }
    var performanceB = function() {}
    performanceB.prototype.calculate = function(salary) {
        return salary*3
    }
    var performanceC = function() {}
    performanceC.prototype.calculate = function(salary) {
        return salary*2
    }
    //奖金类
    var Bouns = function() {
        this.salary = null; //原始工资
        this.levelObj = null; //绩效等级对应的策略模式
    }
    Bouns.prototype.setSalary = function(salary) {
        // 保存员工的原始工资
        this.salary = salary;
    }
    Bouns.prototype.setlevelObj = function(levelObj) {
        // 设置员工绩效等级对应的策略模式
        this.levelObj = levelObj;
    }
    Bouns.prototype.getBouns = function() {
        // 把计算奖金的操做委托给对应的策略对象
        return this.levelObj.calculate(this.salary)
    }
    var bouns = new Bouns();
    bouns.setSalary(1000);
    bouns.setlevelObj(new performanceA());
    console.log(bouns.getBouns()) // 4000
    bouns.setlevelObj(new performanceB())
    console.log(bouns.getBouns()) // 3000

策略模式 应该至少由两部分组成,一部分使策略类,就是里面封装了具体的算法。而且负责具体的计算过程。第二个部门就是环境类Context。该Contex接收客户的请求,而后把请求委托给符合要求的某一个策略类。

策略模式的优势:

优势: 

- 避免使用大量的if-else语句,使代码块简洁,易读。

- 符合设计原则中的开放-封闭原则,面向扩展开放,面向修改关闭。

- 复用性高

缺点:

- 增长了许多策略类或者策略对象

总结:

 

策略模式定义了一系列的算法,从概念上讲,全部的这些算法都是作相同的事情,只是实现不一样,他能够以相同的方式调用全部的方法,减小了各类算法类与使用算法类之间的耦合。

相关文章
相关标签/搜索