策略模式是把程序不變的邏輯與可變的邏輯分別封裝,讓算法的變化獨立于使用算法的客戶,這樣設計有很好的擴展性,可根據需求修改算法或增刪都不會影響客戶代碼。
示例:設計鴨子
一、鴨子基礎類
封裝了鴨子的基礎特性,包含了行為和特征,行為用接口的形式聲明,不實現(xiàn)具體行為,鴨子的子類可動態(tài)設置行為,與鴨子本身解耦,特征用抽象方法來聲明,是每個鴨子必有的特性。
public abstract class BaseDuck {
protected BaseFlyBehavior flyBehavior;
protected BaseQuackBehavior quackBehavior;
public void setFlyBehavior(BaseFlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}
public void setQuackBehavior(BaseQuackBehavior quackBehavior) {
this.quackBehavior = quackBehavior;
}
/**
* 鴨子介紹
*/
public abstract void display();
/**
* 鴨子飛
*/
public void performFly() {
flyBehavior.flay();
}
/**
* 鴨子叫
*/
public void performQuack() {
quackBehavior.quack();
}
}
二、定義鴨子行為接口
新創(chuàng)建的所有行為都必須實現(xiàn)此接口,然后在覆蓋的方法中實現(xiàn)具體的行為(算法)。
1.鴨子的飛行
public interface BaseFlyBehavior {
public void flay();
}
2.鴨子的叫喚
public interface BaseQuackBehavior {
public void quack();
}
三、實現(xiàn)鴨子的行為
都需實現(xiàn)BaseFlyBehavior、BaseQuackBehavior接口,然后在flay()、quack()中編寫具體行為。
1.會飛
public class FlyWithWings implements BaseFlyBehavior {
@Override
public void flay() {
Log.i("==TAG==", "會飛");
}
}
2.不會飛
public class FlyNoWay implements BaseFlyBehavior {
@Override
public void flay() {
Log.i("==TAG==", "不會飛");
}
}
3.會嘎嘎叫
public class Quack implements BaseQuackBehavior {
@Override
public void quack() {
Log.i("==TAG==", "嘎嘎叫");
}
}
4.不會叫
public class MuteQuack implements BaseQuackBehavior {
@Override
public void quack() {
Log.i("==TAG==", "不會叫");
}
}
4.具備火箭動力
public class FlyRocketPowered implements BaseFlyBehavior {
@Override
public void flay() {
Log.i("==TAG==", "我具備了火箭動力");
}
}
三、實現(xiàn)多種類型的鴨子
1.綠頭鴨
會嘎嘎叫,會飛
public class MallardDuck extends BaseDuck {
public MallardDuck(){
quackBehavior = new Quack();
flyBehavior = new FlyWithWings();
}
@Override
public void display() {
Log.i("==TAG==","我是綠頭鴨");
}
}
2.模型鴨
不會叫,不會飛
public class ModelDuck extends BaseDuck {
public ModelDuck(){
quackBehavior = new MuteQuack();
flyBehavior = new FlyNoWay();
}
@Override
public void display() {
Log.i("==TAG==", "我是模型鴨");
}
}
四、生產鴨子
可以看到所有的鴨子都實現(xiàn)了鴨子基類,并用鴨子基類聲明,這使得生產的多個鴨子有了很好的約束性,同時行為的分離封裝保證了其很高的可擴展性,這樣的設計能應對不斷變化的需求,屆時只需創(chuàng)建新的行為即可。
public class StrategyControl {
private static StrategyControl mInstance;
public static StrategyControl getInstance() {
if (mInstance == null) {
synchronized (StrategyControl.class) {
if (mInstance == null) {
mInstance = new StrategyControl();
}
}
}
return mInstance;
}
public void execute() {
//綠頭鴨
BaseDuck mallardDuck = new MallardDuck();
mallardDuck.display();
mallardDuck.performQuack();
mallardDuck.performFly();
//模型鴨
BaseDuck modelDuck = new ModelDuck();
modelDuck.display();
modelDuck.performQuack();
modelDuck.performFly();
//模型鴨具備火箭動力
modelDuck.setFlyBehavior(new FlyRocketPowered());
modelDuck.performFly();
}
}