問題:
如何讓算法和對象分開來,使得算法可以獨立于使用它的客戶而變化?
方案:
把一個類中經常改變或者将來可能改變的部分提取出來,作為一個接口,然後在類中包含這個對象的執行個體,這樣類的執行個體在運作時就可以随意調用實作了這個接口的類的行為。比如定義一系列的算法,把每一個算法封裝起來, 并且使它們可互相替換,使得算法可獨立于使用它的客戶而變化。這就是政策模式。
适用情況:
許多相關的類僅僅是行為有異。 “政策”提供了一種用多個行為中的一個行為來配置一個類的方法。即一個系統需要動态地在幾種算法中選擇一種。當一個應用程式需要實作一種特定的服務或者功能,而且該程式有多種實作方式時使用。一個類定義了多種行為 , 并且這些行為在這個類的操作中以多個條件語句的形式出現。将相關的條件分支移入它們各自的Strategy類中以代替這些條件語句。
優點:
1、可以動态的改變對象的行為
缺點:
1、用戶端必須知道所有的政策類,并自行決定使用哪一個政策類
2、政策模式将造成産生很多政策類
應用:
我們平時出行的方式:出行方式有很多種,具體用哪一種根據動态的選擇;
首先建立我們的抽象行為類,和具體的行為類;
1 package strategy;//政策模式
2
3 //抽象的行為類
4 public interface Strategy {
5 public void go();//出行方式
6 }
7
8
9
10
11 package strategy;
12
13 public class ConcreteStrategy1 implements Strategy {//具體的出行方式
14
15 @Override
16 public void go() {
17 // TODO Auto-generated method stub
18 System.out.println("坐公共汽車!");
19 }
20
21 }
22
23
24
25
26
27 package strategy;
28
29 public class ConcreteStrategy2 implements Strategy {//具體的出行方式
30
31 @Override
32 public void go() {
33 // TODO Auto-generated method stub
34 System.out.println("自駕車!");
35 }
36 }
然後建立一個調用者,也就是使用者,把能使用的行為給導入進來;
1 package strategy;
2
3 public class Context {//環境類其實也就是一個調用類,出行的人
4 private Strategy s;
5
6 public Context(Strategy s) {
7 super();
8 this.s = s;
9 }
10 public void operate(){
11 s.go();
12 }
13 }
最後就是進行出行了;
1 package strategy;
2
3 public class Test {
4 public static void main(String[] args) {
5 Context c =new Context(new ConcreteStrategy1());
6 c.operate();
7
8 c =new Context(new ConcreteStrategy2());
9 c.operate();
10 }
11 }

歡迎大家一起說出自己的想法。