參考文檔:
策略模式(Strategy)
概念
對(duì)于一組算法,將每一個(gè)算法封裝到具有共同接口的獨(dú)立的類中果漾,從而使得它們可以互相替換。
目的
環(huán)境僅依賴抽象策略长捧,但是不依賴具體的某個(gè)策略成玫,故可以做到在不改變環(huán)境的前提下,進(jìn)行策略的更換。
優(yōu)點(diǎn)
提供了管理一個(gè)算法族的解決方案,可以避免使用多重條件語(yǔ)句來判斷具體采用哪個(gè)算法肆捕。
缺點(diǎn)
客戶端必須知道所有的策略類,并自行決定使用哪一個(gè)策略類盖高;策略模式會(huì)造成很多(策略)類福压。
角色
- 環(huán)境(Context) :持有一個(gè)Strategy類的引用。
- 抽象策略(Strategy):所有的具體策略類必須實(shí)現(xiàn)此接口或舞。
- 具體策略(ConcreteStrategy):包裝了相關(guān)的算法。
jdk中的策略模式
線程池拒絕策略
/**
* 環(huán)境ThreadPoolExecutor:持有一個(gè)RejectedExecutionHandler類的引用
*/
public class ThreadPoolExecutor extends AbstractExecutorService {
private volatile RejectedExecutionHandler handler;
}
/**
* 抽象策略RejectedExecutionHandler
*/
public interface RejectedExecutionHandler {
void rejectedExecution(Runnable r, ThreadPoolExecutor executor);
}
/**
* 具體策略AbortPolicy
*/
public static class AbortPolicy implements RejectedExecutionHandler {
public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
throw new RejectedExecutionException("Task " + r.toString() + " rejected from " + e.toString());
}
}