天天看點

設計模式---政策模式

定義了一系列的算法,并将每一個算法封裝起來,而且使它們還可以互相替換。政策模式讓算法獨立于使用它的客戶而獨立變化。

政策模式

通俗一點來說就是把 if 判斷語句給封裝了,提高了代碼的擴充性和可維護性. 對外隐藏了具體的算法實作.

?示意圖:
設計模式---政策模式
三個角色:

● 環境(Context)角色:持有一個Strategy的引用。

● 抽象政策(Strategy)角色:這是一個抽象角色,通常由一個接口或抽象類實作。此角色給出所有的具體政策類所需的接口。

● 具體政策(ConcreteStrategy)角色:包裝了相關的算法或行為。

這個圖有點類是于門面模式,但是值得注意的是?門面模式是對所有方法進行一個封裝.這裡隻是對某個方法.

應用場景

政策模式的用意是針對一組算法或邏輯,将每一個算法或邏輯封裝到具有共同接口的獨立的類中,進而使得它們之間可以互相替換。政策模式使得算法或邏輯可以在不影響到用戶端的情況下發生變化。說到政策模式就不得不提及OCP(Open Closed Principle) 開閉原則,即對擴充開放,對修改關閉。政策模式的出現很好地诠釋了開閉原則,有效地減少了分支語句。

代碼案例

此代碼通過模拟不同會員購物車打折力度不同分為三種政策,初級會員,中級會員,進階會員。

✍上代碼:

//政策模式 定義抽象方法 所有支援公共接口
abstract class Strategy {

	// 算法方法
	abstract void algorithmInterface();

}

public class StrategyA extends Strategy {

	@Override
	void algorithmInterface() {
		System.out.println("算法A");

	}

}

public class StrategyB extends Strategy {

	@Override
	void algorithmInterface() {
		System.out.println("算法B");

	}

}

/**
 * 中間層的Context類實作了對底層實作的隐藏,更符合設計模式開閉的思想
 * @author Administrator
 * 
 */
public class Test {
	public static void main(String[] args) {
		Context context;
		context = new Context(new StrategyA());
		context.algorithmInterface();
		
		context = new Context(new StrategyB());
		context.algorithmInterface();
		
	}

}

           
政策模式的優點:
  • 算法可以自由切換;
  • 避免使用多重條件判斷;
  • 擴充性良好。
政策模式的缺點:
  • 政策類會增多
  • 所有政策類都需要對外暴露

總結

政策模式的本質:

分離算法,選擇實作。

如果你仔細思考政策模式的結構和功能的話,就會發現:如果沒有上下文,政策模式就回到了最基本的接口和實作了,隻要是面向接口程式設計,就能夠享受到面向接口程式設計帶來的好處,通過一個統一的政策接口來封裝和分離各個具體的政策實作,無需關系具體的政策實作。

政策模式展現了開閉原則:政策模式把一系列的可變算法進行封裝,進而定義了良好的程式結構,在出現新的算法的時候,可以很容易的将新的算法實作加入到已有的系統中,而已有的實作不需要修改。

政策模式展現了裡氏替換原則:政策模式是一個扁平的結構,各個政策實作都是兄弟關系,實作了同一個接口或者繼承了同一個抽象類。這樣隻要使用政策的用戶端保持面向抽象程式設計,就可以動态的切換不同的政策實作以進行替換。