1. 程式人生 > >Java設計模式:策略模式

Java設計模式:策略模式

原文連結 譯者:秦建平

下面是一個有關於策略模式的故事。假設Mike在開車的時候,會很頻繁的加速,有一天因為超速他被一個警察攔下來了。有可能這個警察會比較友好,沒開任何罰單就讓Mike把車開走了。(我們把這型別的警察稱之為“NicePolice”)。也有可能Mike遇到了一個不太友好的警察,然後這個警察給Mike出具了一張罰單。(我們把這型別的警察稱之為“HardPolice”)。
Mike其實並不知道他會遇到什麼型別的警察,直到他因為超速而被警察要求停車下來,實際上這就是一種程式當中“執行時”的概念,只有在執行的時候,才知道,到底會遇到什麼型別的警察,實際上這就是“策略模式”。

strategy-pattern-class-diagram
先來定義一個策略的介面:Strategy

public interface Strategy {
	public void processSpeeding(int speed);
}

再來定義兩種不同型別的Strategy:

public class NicePolice implements Strategy {
	@Override
	public void processSpeeding(int speed) {
		System.out
				.println("This is your first time, be sure don't do it again!");
	}
}
public class HardPolice implements Strategy {
        @Override
	public void processSpeeding(int speed) {
		System.out.println("Your speed is " + speed
				+ ", and should get a ticket!");
	}
}

定義一個需要依賴警察來處理超速問題的場景:

public class Situation {
   private Strategy strategy;
   
   public Situation(Strategy strategy){
	   this.strategy = strategy;
   }
   
   public void handleByPolice(int speed){
	   this.strategy.processSpeeding(speed);
   }
}

最後,進行測試:

public class Main {
	public static void main(String[] args) {
		HardPolice hp = new HardPolice();
		NicePolice ep = new NicePolice();

		// In situation 1, a hard officer is met
		// In situation 2, a nice officer is met
		Situation s1 = new Situation(hp);
		Situation s2 = new Situation(ep);

		// the result based on the kind of police officer.
		s1.handleByPolice(10);
		s2.handleByPolice(10);
	}
}

策略模式,實際上就是定義了一些演算法,並把他們都封裝起來,使得他們之間可以互相替代。實際上對應上面程式,就是定義了兩種演算法(NicePolice以及HardPolice),由於他們都實現了Strategy這個介面,那麼對於依賴於這個介面的例項物件來說,可以動態的對這個依賴進行注入,從而達到執行時確定具體使用哪一種演算法的目的。


秦建平

專注於Android、Java、效能優化,《Android程式設計寶典》作者,嚮往自由,為目標前行