1. 程式人生 > 資訊 >EA 研發出新測試 AI:有望將人工測試員從無聊枯燥的普通測試中解放出來

EA 研發出新測試 AI:有望將人工測試員從無聊枯燥的普通測試中解放出來

策略模式基本介紹

1.策略模式(Strategy Pattern)中,定義演算法簇,分別封裝起來,讓他們之間可以互相替換,此模式讓演算法的變化獨立於使用演算法的客戶
2.這演算法體現了幾個設計原則,第一:把變化的程式碼從不變的程式碼中分離出來;第二:針對介面程式設計而不是具體類(定義了策略介面);第三:多用組合/聚合,少用繼承(客戶通過組合方式使用策略)

策略模式原理類圖

從圖中可以看到,客戶context有成員變數strategy或者其他的策略介面,至於使用到哪個策略,可以在構造器中指定

策略模式解決鴨子問題

編寫鴨子專案,要求:
1.有各種鴨子(野鴨,橡皮鴨,水鴨等),鴨子有各種行為(叫、飛行等)
2.顯示鴨子的資訊


public interface FlyBehavior {

    void fly(); // 子類具體實現
}


public class NoFlyBehavior implements FlyBehavior{
    @Override
    public void fly() {
        System.out.println("不會飛");
    }
}

public class GoodFlyBehavior implements FlyBehavior{
    @Override
    public void fly() {
        System.out.println("飛得高");
    }
}

public class BadFlyBehavior implements FlyBehavior{
    @Override
    public void fly() {
        System.out.println("飛的低");
    }
}

public abstract class Duck {

    //屬性 策略介面
    FlyBehavior flyBehavior;

    public Duck(){

    }

    public abstract void display();// 顯示鴨子資訊

    public void quack(){
        System.out.println("鴨子嘎嘎叫");
    }

    public void swim(){
        System.out.println("鴨子會游泳");
    }

    public void fly(){
        // 改進
       if(flyBehavior != null){
           flyBehavior.fly();
       }
    }

    public void setFlyBehavior(FlyBehavior flyBehavior){
        this.flyBehavior = flyBehavior;
    }
}
public class ToyDuck extends Duck{

    public ToyDuck(){
        flyBehavior = new NoFlyBehavior();
    }

    @Override
    public void display() {
        System.out.println("玩具鴨");
    }

    // 需要重寫父類的所有方法
    public void quack(){
        System.out.println("玩具鴨不能叫");
    }

    public void swim(){
        System.out.println("玩具鴨不會游泳");
    }
}


public class WildDuck extends Duck{

    // 構造器,傳入FlyBehavior的物件
    public WildDuck() {
        flyBehavior = new GoodFlyBehavior();
    }

    @Override
    public void display() {
        System.out.println("野鴨");
    }
}


public class PekingDuck extends Duck{

    public PekingDuck(){
        flyBehavior = new NoFlyBehavior();
    }

    @Override
    public void display() {
        System.out.println("北京鴨");
    }
}


public class Client {
    public static void main(String[] args) {
        WildDuck wildDuck = new WildDuck();
        wildDuck.fly();

        ToyDuck toyDuck = new ToyDuck();
        toyDuck.fly();

        PekingDuck pekingDuck = new PekingDuck();
        pekingDuck.fly();

        // 動態改變某個物件的行為
        pekingDuck.setFlyBehavior(new GoodFlyBehavior());
        pekingDuck.fly();
    }
}

策略模式的注意事項和細節

1.策略模式的關鍵是:分析專案中變化部分與不變部分
2.策略模式的核心思想是:多用組合/聚合 少用繼承;用行為類組合,而不是行為的繼承,更有彈性
3.體現了OCP原則客戶端增加行為不用修改原有程式碼,只要新增一種策略(或者行為)即可,避免了多重轉移(if..else if..else)
4.提供了可以替換繼承關係的辦法:策略模式將演算法封裝在獨立的Strategy類中使得你獨立於其Context改變它,
  使它易於切換、易於理解、易於擴充套件
5.需要注意的是:每新增一個策略就要增加一個類,當策略過多會導致類數目龐大