策略模式屬於對象的行爲模式。其用意是針對一組算法,將每個算法封裝到具體的共同接口的獨立類中,從而使得他們能夠互相替換。算法
策略模式使得算法能夠在不影響客戶端的狀況下發生變化。函數
all in one 「準備一組算法,並將每個算法封裝起來,使得它們能夠互換」。this
三個角色:spa
環境context角色:持有一個Strategy的引用code
策略接口角色:這是一個抽象角色,一般由一個接口或抽象類實現。此角色給出全部的具體策略類所需的接口。對象
策略角色:包裝了相關的算法或行爲blog
環境角色:接口
package com.yzf.pattern.strategy; /** * 策略模式的重心不是如何實現算法,而是如何組織、調用這些算法,從而讓程序結構更靈活,具備更好的維護性和擴展性。 * 在每個時刻只能使用一個具體的策略實現對象 * @author luozuzu * */ public class Price { //持有一個具體的策略對象 private MemberStrategy memberStrategy; /** * 構造函數,傳入一個具體的策略對象 * @param memberStrategy */ public Price( MemberStrategy memberStrategy){ this.memberStrategy = memberStrategy; } public double quote(double price){ return this.memberStrategy.calcPrice(price); } }
接口類:class
package com.yzf.pattern.strategy; //策略接口 public interface MemberStrategy { public double calcPrice(double price); }
策略實現類擴展
package com.yzf.pattern.strategy; public class FirstMemberStrategy implements MemberStrategy { //具體策略算法1 public double calcPrice(double price) { System.out.println("對於初級會員的沒有折扣"); return price; } }
package com.yzf.pattern.strategy; public class SecondMemberStrategy implements MemberStrategy { //具體策略算法2 public double calcPrice(double price) { System.out.println("對於中級會員的折扣爲10%"); return price * 0.9; } }
package com.yzf.pattern.strategy; public class ThirdMemberStrategy implements MemberStrategy { //具體策略算法3 public double calcPrice(double price) { System.out.println("對於高級會員的折扣爲20%"); return price * 0.8; } }
客戶端
package com.yzf.pattern.strategy; public class Client { public static void main(String[] args) { //MemberStrategy ms = new FirstMemberStrategy(); //MemberStrategy ms = new FirstMemberStrategy(); MemberStrategy ms = new SecondMemberStrategy(); Price p = new Price(ms); double quote = p.quote(300); System.out.println(quote); } }
策略模式的重心不是如何實現算法,而是如何組織、調用這些算法,從而讓程序結構更靈活,具備更好的維護性和擴展性。