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語句,使代碼塊簡潔,易讀。

- 符合設計原則中的開放-封閉原則,面向擴展開放,面向修改關閉。

- 複用性高

缺點:

- 增長了許多策略類或者策略對象

總結:

 

策略模式定義了一系列的算法,從概念上講,全部的這些算法都是作相同的事情,只是實現不一樣,他能夠以相同的方式調用全部的方法,減小了各類算法類與使用算法類之間的耦合。

相關文章
相關標籤/搜索