本文實例講述了Java經典設計模式之策略模式。分享給大家供大家參考,具體如下:
策略模式指:策略模式指將程序中可變部分抽象分離成一系列的算法,并將每一個算法封裝起來,而且使它們還可以相互替換。策略模式讓算法獨立于使用它的客戶而獨立變化。
策略模式一般由下面三部分組成:
1. 抽象策略角色: 策略類,通常由一個接口或者抽象類實現。
2. 具體策略角色:包裝了相關的算法和行為。
3. 環境角色:持有某一個策略類的引用,客戶端調用。
策略模式設計原則:
1. 把程序中需要變化的部分抽離出來,獨立于不變的部分
2. 面向接口編程,而不是面向實現編程,多作組合 ,少用繼承。(組合 :在類中增加一個私有域,引用另外一個已經有的類的實例,通過調用實例的方法從而獲得新的功能)
應用舉例,以銀行為例,可能有點不恰當
比如我們應用要接入銀行支付功能。我們都知道,銀行都有支付功能,隨著技術的發展,銀行具有了開通網絡支付的功能。現在我們遇到的問題是,我們要增加支付的銀行,但是有的銀行還沒有開通網絡銀行,有的已經開通了,而且也要把原有接入 的銀行添加上網絡銀行功能(如果已經開通的話)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
//銀行基類,為了適應變化,增加了網絡支付處理的策略處理接口BankStrategy public abstract class Bank { private BankStrategy mBankStrategy; public void setmStrategy(BankStrategy mStrategy) { this .mBankStrategy = mStrategy; } public void payMoney() { System.out.println( "我具有支付功能" ); // 所有銀行共同的特征 } public abstract void serviceStyle(); // 但每個銀行有不同的服務方法(比的就是服務),具體的子類實現 public void netBank(){ //開通網上銀行 mBankStrategy.netPay(); } } //———-銀行策略接口——————————— public interface BankStrategy { void netPay(); // 添加網絡支付功能 } //————–增加開通網絡支付的策略實現類———— public class CanNetBank implements BankStrategy { @Override public void netPay() { System.out.println( "我已經開通網絡支付功能" ); } } //————–也有不開通網絡支付的銀行————— public class NoNetBank implements BankStrategy { @Override public void netPay() { System.out.println( "我不開通網絡銀行,咋的!" ); } } //——-地球銀行:現在開通網絡支付—————— public class EarthBank extends Bank { public EarthBank(){ super (); super .setmStrategy( new CanNetBank()); //這里就實現了網絡支付 } @Override public void serviceStyle() { System.out.println( "我的服務在事個地球上是最好的!" ); } } //——–太陽銀行,說離我們太遠了,不開通網絡銀行——————- public class SunBank extends Bank { public SunBank(){ super (); super .setmStrategy( new NoNetBank()); //這里就不開通了(當然可不調用 ,只是告訴下實現方法) } @Override public void serviceStyle() { System.out.println( "我的服務像金子一樣發光!" ); } } //———測試類———————————– public class Test { public static void main(String[] args) { System.out.println( "———測試———–" ); Bank duck= null ; duck= new EarthBank(); duck.serviceStyle(); duck.payMoney(); duck.netBank(); System.out.println( "———測試———–" ); duck= new SunBank(); duck.serviceStyle(); duck.payMoney(); duck.netBank(); } } |
結果打印
策略模式的優點:
1、 提供了管理相關的算法策略類,恰當使用繼承可以把公共的代碼轉移到父類里面,避免重復的代碼,使得架構也更加靈活。
2、 提供了可以替換繼承關系的辦法(組合)。繼承也可以處理多種算法或行為,但算法或行為的環境類就可能會有一些子類,每一個子類提供一個不同的算法或行為。這樣一來算法或行為的使用者就和算法或行為本身混在一起。使得動態改變算法變得復雜甚至不可行,也不符合開閉原則。
3、 相對于繼承代碼更好地得到復用,同時可以避免使用多重條件轉移語句。
策略模式的缺點:
1、客戶代碼需要了解個策略實現的細節,只適用于客戶端知道所有的算法或行為的情況。
2、 策略模式造成很多的策略類,每個具體策略類都會產生一個新類,增加了對象的數目。
希望本文所述對大家java程序設計有所幫助。