JavaRush /Java Blog /Random-TW /模板策略(Strategy)

模板策略(Strategy)

在 Random-TW 群組發布
策略模式定義了一系列演算法,封裝了它們中的每一個,並確保它們是可互換的。它允許演算法獨立於客戶端的使用而進行修改(這個定義取自 Eric Freeman 和 Elizabeth Robson 所著的《Head First. Design Patterns》一書)。這個定義看起來有點混亂,所以我們需要用普通語言更詳細地解釋這個定義。讓我們從宗教開始:)世界上有許多宗教(懺悔、運動、信仰等)。我們如何用程式碼來描述這一點。嗯,例如,我們可以選擇宗教類別並從中繼承其他宗教。讓我們抽象掉不必要的東西並在 Religion 類別中使用一個 believe() 方法。
public abstract class Religion {
    public void believe() {
        System.out.println("Я верю в Бога-творца этого мира");
    }
}
所有其他宗教都可以從這個階級繼承。如果我們只限於基督教,甚至伊斯蘭教和猶太教,那麼就不會有問題。
public class Judaism extends Religion {
}
public class Islam extends Religion {
}
public class Christianity extends Religion {
}
但如果你想想現在存在的其他宗教(或以前存在但消失了),那麼問題就會出現,至少對佛教徒來說是如此。你必須重寫他們的 believe 方法。
public class Buddhism extends Religion {
    @Override
    public void believe() {
        System.out.println("Есть Бог or боги or нет, это не важно, главное достичь нирваны :)");
    };
}
由於有許多宗教,他們甚至相信麵食怪物(Pastafarianism),那麼在所有這些宗教中你將不得不重新定義信仰方法。但是我們是否可以採取不同的做法,將此方法移至 Faith 介面並在其中實作 believe 方法,並在每個類別中實現此方法(並根據我們的意願在每個類別中實現它)?但隨後我們就會出現代碼重複,至少在猶太人和基督徒中是如此。真主的穆斯林可以用阿拉伯語書寫。
public interface Faith {
    public void believe();
}
public class Christianity implements Faith {
    @Override
    public void believe() {
        System.out.println("Я верю в Бога-творца этого мира");
    }
}
public class Judaism implements Faith {
    @Override
    public void believe() {
        System.out.println("Я верю в Бога-творца этого мира");
    }
}
實作預設方法在這裡沒有多大幫助;宗教如此之多,即使您在 Faith 介面中預設定義了此方法,您也必須在所有非一神教宗教中以自己的方式實現此方法,並重複它某處。 在這種情況下,策略模式為我們提供了什麼: 它為目前介面建立現成的模板類,然後將其替換為特定宗教的建構函數。那些。定義並建立與定義開頭提到的同一系列演算法。
public interface Faith {
    public void believe();
}
public class AbrahamicReligion implements Faith {
    @Override
    public void believe() {
        System.out.println("Я верю в Бога-творца этого мира");
    }
}
public class BuddismReligion implements Faith {
    @Override
    public void believe() {
        System.out.println("Есть Бог or боги or нет, это не важно, главное достичь нирваны :)");
    }
}
public class JediismReligion implements Faith {
    @Override
    public void believe() {
        System.out.println("Да пребудет с вами Сила!");
    }
}
並在構造函數中的每個類別中替換它們。
public abstract class Religion {
    Faith faith;
}
public class Judaism extends Religion{

    public Judaism() {
        this.faith = new AbrahamicReligion();
    }
}
public class Christianity extends Religion{

    public Christianity() {
        this.faith = new AbrahamicReligion();
    }
}
public class Buddhism extends Religion {

    public Buddhism() {
        this.faith = new BuddismReligion();
    }
}
因此,如果您需要在專案中包含另一種宗教,則不必為所有類別或部分類別重新定義 believe 方法。您只需要實作實作 Faith 介面的缺失類別(如果還沒有),並將此類新增至新宗教的建構函式中。
public class PastafarianismReligion implements Faith{

    @Override
    public void believe() {
        System.out.println("Кто съел мои макароны???");
    }
}
public class Pastafarianism extends Religion {

    public Pastafarianism() {
        this.faith = new PastafarianismReligion();
    }
}
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION