1.
策略模式將行為和環境隔離開來,環境角色類負責維持和查詢行為的類,各種類似的邏輯算法都在各個具體的策略類中進行實現,由於環境和行為隔離開來,所以行為的邏輯變更不會影響到環境和客戶端。
2.uml類圖:
這個模式涉及到三個角色:
環境(Context)角色:持有一個Strategy的引用。
抽象策略(Strategy)角色:這是一個抽象角色,通常由一個接口或抽象類實現。此角色給出所有的具體策略類所需的接口。
具體策略(ConcreteStrategy)角色:包裝了相關的算法或行為。
3.代碼結構截圖:(代碼不多,耐心看完)
4.代碼如下:
abstract修飾方法就是要求其子類覆蓋(實現)這個方法。調用時可以以多態方式調用子類覆蓋(實現)后的方法,也就是說抽象方法必須在其子類中實現,除非子類本身也是抽象類。 需要注意:父類是抽象類,其中有抽象方法,那么子類繼承父類,並把父類中的所有抽象方法都實現(覆蓋)了,子類才有創建對象的實例的能力,否則子類也必須是抽象類。 凡是抽象類,就一定會是某個類的父類!否則,這個抽象類的存在沒有意義,因為抽象類不能被實例化。 既然抽象類一定是某一個類的父類,所以,這個抽象類一定要有構造函數!這樣,抽象類的子類才能成功實例化。 抽象類也有構造函數,只是,這個構造函數是給子類提供的。所以如果抽象類繼承其他類,那么抽象類的構造函數也會使用super語句,所以被繼承類也必須有對外提供的構造函數
public abstract class Strategy { //定義抽象策略的方法 public abstract int strategy(int a, int b);//假如這是一種支付業務,支付策略有4種 }
public class StrategyOne extends Strategy { public int strategy(int a, int b) { //無卡支付方式 return a + b*2;//此處寫相關業務代碼 } } public class StrategySecond extends Strategy { //會員支付方式 public int strategy(int a, int b) { return a+b;//此處寫相關業務代碼 } } public class StrategyThird extends Strategy { //applePay支付 public int strategy(int a,int b) { return a+b*3;//此處寫相關業務代碼 } } public class StrategyFourth extends Strategy { public int strategy(int a,int b) {//某某支付方式 return a+b*4;//此處寫相關業務代碼 } }
public class Context { //持有抽象策略角色的引用,用於客戶端調用 private Strategy strategy;//獲得策略類 public Strategy getStrategy() { return strategy; } //設置所需策略 public void setStrategy(Strategy strategy) { this.strategy = strategy; } //根據設置的策略類返回對應的結果 public int getResult(int a, int b) { return strategy.strategy(a, b); } }
public class Client { public static void main(String[] args) { Context context = new Context(); int result; context.setStrategy(new StrategySecond()); result = context.getResult(1, 2); System.out.println("Second: "+result); context.setStrategy(new StrategyOne()); result =context.getResult(1, 2); System.out.println("One: "+result); context.setStrategy(new StrategyThird()); result = context.getResult(1, 2); System.out.println("Third: "+result); context.setStrategy(new StrategyFourth()); result = context.getResult(1, 2); System.out.println("Fourth: "+result); } }