策略模式
GOF對于策略模式的定義是:“策略模式定義了算法家族,分別封裝起來,讓他們之間可以互相替換,此模式讓算法的變化不會影響到使用算法的客戶。”
策略可以理解為算法,它們完成相同的動作,只是處理的過程不盡相同,也就是同樣的輸入由于策略的不同會造成不同的輸出。策略模式以相同的調(diào)用來使用所有的算法,降低了算法類與使用算法類之間的耦合。
可以想象成做acm題,一道題可以用不同的算法進(jìn)行ac,比如一些最短路徑的題目,可以考慮把dijstra,floyd,spfa幾種算法封裝成策略,這樣碰到新的題目的時候可以快速解決。
接下來直接上代碼,以蛋糕店不同的季節(jié)生產(chǎn)不同的蛋糕為例。
package Strategy;
public abstract class ProduceStrategy {
protected abstract void Decision(int capital);
}
package Strategy;
public class ProduceStrategySummer extends ProduceStrategy{
@Override
public void Decision(int capital) {
// TODO Auto-generated method stub
// c 巧克力蛋糕 I 冰淇淋蛋糕
double capitalForC = (double)capital * 0.1;
int countForC = (int)(capitalForC/5);
double capitalForI = (double)capital * 0.9;
int countForI = (int)(capitalForI/3);
System.out.println("巧克力蛋糕的數(shù)量為:"+countForC);
System.out.println("冰淇淋蛋糕的數(shù)量為:"+countForI);
}
}
package Strategy;
public class ProduceStrategyWinter extends ProduceStrategy{
@Override
public void Decision(int capital) {
// TODO Auto-generated method stub
double capitalForC = (double)capital * 0.8;
int countForC = (int)(capitalForC/5);
double capitalForI = (double)capital * 0.2;
int countForI = (int)(capitalForI/3);
System.out.println("巧克力蛋糕的數(shù)量為:"+countForC);
System.out.println("冰淇淋蛋糕的數(shù)量為:"+countForI);
}
}
package Strategy;
public class ProduceContext {
private ProduceStrategy ps;
public ProduceContext(ProduceStrategy ps) {
this.ps = ps;
}
public void GetDecision(int capital)
{
ps.Decision(capital);
}
}
package Strategy;
public class client {
public static void test(int season,int capital)
{
if(season == 1)
{
ProduceContext pc = new ProduceContext(new ProduceStrategySummer());
pc.GetDecision(capital);
}
else {
ProduceContext pc = new ProduceContext(new ProduceStrategyWinter());
pc.GetDecision(capital);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
test(2,100);
}
}
使用策略模式能夠把互相之間能夠替換的策略封裝在某些類的內(nèi)部,這些類通常是互相分開的,每個類都會實(shí)現(xiàn)一個同策略相關(guān)的公共操作,這些公共操作會規(guī)定好策略的輸入和輸出,但是操作的實(shí)現(xiàn)會由各個策略類獨(dú)自完成。
策略類的使用情況:
- 很多相關(guān)的類只是在行為上有差異
- 當(dāng)需要使用一個算法的不同變體時
- 使用算法的客戶不應(yīng)該知道算法的具體結(jié)構(gòu)時
- 當(dāng)一個類定義了多種行為并且這些行為在這個類的操作中以多個條件語句的形式出現(xiàn)時。