策略模式的理解


一、是什么?作用?

  策略模式的思想是定義一些算法族,分別封裝起來,讓他們可以相互替換,此模式讓算法的變化獨立於使用算法的客戶

  策略模式的適用場景: 

  • 當一個系統中有許多類,它們之間的區別僅在於它們的行為,希望動態地讓一個對象在許多行為中選擇一種行為時; 
  • 當一個系統需要動態地在幾種算法中選擇一種時;
  • 當一個對象有很多的行為,不想使用多重的條件選擇語句來選擇使用哪個行為時。

二、使用實例

  場景:鴨子分為綠頭鴨和模型鴨子,以后還能有其他鴨子,綠頭鴨可以呱呱叫,也可以用翅膀飛,模型鴨子可以呱呱叫,但是不能飛

  1. 定義飛的接口行為 

/**
 * 飛的接口類
 */
public interface FlyBehavior {

    void fly();
}

// ============================
/**
 * 用翅膀飛 - 實現類
 */
public class FlyWithWings implements FlyBehavior {
    @Override
    public void fly() {
        System.out.println("I'm flying");
    }
}

// =========================

/**
 * 不會飛 - 實現類
 */
public class FlyNoWay implements FlyBehavior {
    @Override
    public void fly() {
        System.out.println("I can't fly");
    }
}

2. 定義叫的接口行為

/**
 * 叫的接口類
 */
public interface QuackBehavior {

    void quack();
}

// =======================
/**
 * 咕咕叫
 */
public class MuteQuack implements QuackBehavior {
    @Override
    public void quack() {
        System.out.println("咕咕叫");
    }
}

// =======================

/**
 * 嘎嘎叫
 */
public class Squeak implements QuackBehavior {
    @Override
    public void quack() {
        System.out.println("嘎嘎叫");
    }
}

3. 編寫鴨子類, 注意這里有的是組合

/**
 * 鴨子類 基類, 注: 這里可以寫給set行為的方法,方便動態設置行為
 */
public abstract class Duck {

    private FlyBehavior flyBehavior;
    private QuackBehavior quackBehavior;

    public Duck() { }

    // 執行飛的動作
    public void performFly() {
        flyBehavior.fly();
    }

    // 執行叫的動作
    public void performQuack() {
        quackBehavior.quack();
    }
}
/**
 * 綠頭野鴨類 注意點: 就在鴨子的行為在這個時候賦值給鴨子, 想換別的行為隨便換 
 */
public class MallardDuck extends Duck{

    public MallardDuck() {
        this.flyBehavior = new FlyWithWings();
        this.quackBehavior = new MuteQuack();
    }
}

4. 測試

/**
 * 小鴨子測試類
 */
public class MiniDuckSimulator {

    public static void main(String[] args) {
        Duck mallard = new MallardDuck();
        mallard.performFly();
        mallard.performQuack();
    }
}

三、總結

1.如果是以前我很可能有鴨子抽象類來定義飛的行為,子類重寫飛的行為,當忽然添加另外一種鴨子,它有特殊的行飛的行為(帶火箭噴射器的翅膀),這時候又得重寫這個行為,不管什么鴨子,我都得重寫他的飛的行為;

2. 如果用了策略模式,只需要要編寫這個特殊飛的行為,然后在這只鴨身上賦上這種行為就行了,其他已經編寫的代碼一點都沒有收到影響,牛批


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM