上篇學習了單例模式,接着學習,堅持就是勝利,今天主要學習下政策模式,參考了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分了。