天天看點

設計模式(二)_ 政策模式

上篇學習了單例模式,接着學習,堅持就是勝利,今天主要學習下政策模式,參考了gitchat周君的相關課程,但是内容全部手打,拒絕粘貼。

什麼是政策模式

政策模式的用意是針對一組算法,将每一個 算法封裝到具有相同接口的獨立類中,進而使得它們之間可以互相替換,此模式讓算法的變化可以不影響用戶端的情況下發生。

一般情況下,我們是将一種行為寫成一個類方法,比如電腦的加、減、乘、除。而政策模式是将每一種算法寫成一個類,然後動态的選擇用哪種算法。

這裡所說的算法并不是 “冒泡排序算法” 之類的算法。它可以是 一段代碼,一個請求、一個業務操作。

實作電腦代碼舉例
第一次畫uml 圖。如有不對請指正
設計模式(二)_ 政策模式

這個例子為加法和減法建立了一個類。具體代碼如下

Operation 接口:

package com.zhb.service;

public interface Operation {
    
    public int doOperation(int num1,int num2);

}
           

2個實作類,加法和減法

public class OperationAdd implements Operation{

    @Override
    public int doOperation(int num1, int num2) {
        
        return num1 + num2;
    }

}


public class OperationSub implements Operation{

    @Override
    public int doOperation(int num1, int num2) {
        
        return num1 - num2;
    }

}
           

電腦類:

package com.zhb.main;

import com.zhb.service.Operation;

public class Calculator {
    
    private Operation operation;



    public void setOperation(Operation operation) {
        this.operation = operation;
    }
    
    public int doOperation(int num1, int num2){
        return this.operation.doOperation(num1, num2);
    }
    

}           

使用:

public static void main(String[] args) {
        Calculator calculator = new Calculator();
        OperationAdd add = new OperationAdd();
        OperationSub sub = new OperationSub();
        
        calculator.setOperation(add);
        int result = calculator.doOperation(1, 2);
        System.out.println(result);
        
        calculator.setOperation(sub);
        int result1 = calculator.doOperation(1, 1);
        System.out.println(result1);
        
    }           

看到這裡,大家一定和我一樣疑惑,感覺這沒必要建新的類,直接一個類2個add(),sub() 方法就可以搞定啊。你如果在寫乘法,還要再寫一個類。多麻煩。

的确,使用政策模式使代碼增多,如果下面這種場景下

如果将你寫好的電腦代碼打包釋出出去,供大家使用。如果大家後來發現,我不僅要加減乘除、還要開方。此時怎麼辦?

如果你用普通寫法的電腦,你可能需要在類中 再增加開方的方法就好了。 但是你 提供的jar包。就算你提供源碼,你希望别人修改你的源碼不?一般提供出去的架構或庫,都是經過千錘百煉的。經過無數次測試的,如果别人修改源碼很容易産生不可預知的錯誤。再其次。實際工作中,你寫的代碼好還行,不好的話,說實話,看都不想看,别說改了。

如果你使用政策模式,你隻需要定義一個開方的類實作Operation 接口。然後調用 calculator.setOperation(new 開方類()); 即可。

這裡很好的展現了一個設計模式的基本原則:開閉原則。

開閉原則說的是 對修改關閉、對擴充開放。

優點

  • 遵守開閉原則,擴充性良好

缺點

  • 随着你的政策增加,你的類也會越來越多
  • 所有 的政策類都要暴露出去,是以如果在實際開發中你使用了政策模式,你一定要讓你同僚知道已有哪些政策。
例子代碼後期會放到github上,每種設計模式的代碼都會上傳上去,敬請期待。

代碼下載下傳

github

學習不是要麼0分,要麼100分的。80分是收獲;60分是收獲;20分也是收獲。有收獲最重要。但是因為着眼于自己的不完美,最終放棄了,那就是徹底的0分了。