1.算法
策略模式將行爲和環境隔離開來,環境角色類負責維持和查詢行爲的類,各類相似的邏輯算法都在各個具體的策略類中進行實現,因爲環境和行爲隔離開來,因此行爲的邏輯變動不會影響到環境和客戶端。app
2.uml類圖:函數
這個模式涉及到三個角色:this
環境(Context)角色:持有一個Strategy的引用。spa
抽象策略(Strategy)角色:這是一個抽象角色,一般由一個接口或抽象類實現。此角色給出全部的具體策略類所需的接口。code
具體策略(ConcreteStrategy)角色:包裝了相關的算法或行爲。對象
3.代碼結構截圖:(代碼很少,耐心看完)blog
4.代碼以下:繼承
abstract修飾方法就是要求其子類覆蓋(實現)這個方法。調用時能夠以多態方式調用子類覆蓋(實現)後的方法,也就是說抽象方法必須在其子類中實現,除非子類自己也是抽象類。 須要注意:父類是抽象類,其中有抽象方法,那麼子類繼承父類,並把父類中的全部抽象方法都實現(覆蓋)了,子類纔有建立對象的實例的能力,不然子類也必須是抽象類。 凡是抽象類,就必定會是某個類的父類!不然,這個抽象類的存在沒有意義,由於抽象類不能被實例化。 既然抽象類必定是某一個類的父類,因此,這個抽象類必定要有構造函數!這樣,抽象類的子類才能成功實例化。 抽象類也有構造函數,只是,這個構造函數是給子類提供的。因此若是抽象類繼承其餘類,那麼抽象類的構造函數也會使用super語句,因此被繼承類也必須有對外提供的構造函數
public abstract class Strategy { //定義抽象策略的方法 public abstract int strategy(int a, int 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(4, 3); System.out.println("One: "+result); context.setStrategy(new StrategyThird()); result = context.getResult(5, 5); System.out.println("Third: "+result); context.setStrategy(new StrategyFourth()); result = context.getResult(6, 6); System.out.println("Fourth: "+result); } }
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;//此處寫相關業務代碼 } }