JavaRush /Java Blog /Random-JA /テンプレート戦略 (戦略)

テンプレート戦略 (戦略)

Random-JA グループに公開済み
Strategy パターンは、アルゴリズムのファミリーを定義し、それぞれをカプセル化し、それらが交換可能であることを保証します。これにより、クライアント側での使用とは独立してアルゴリズムを変更できます (この定義は、エリック・フリーマンとエリザベス・ロブソンの著書「Head First. Design Patterns」から引用しています)。この定義は少しわかりにくいので、この定義を通常の言語でさらに詳しく説明する必要があります。宗教から始めましょう:) 世界には多くの宗教(告白、運動、信念など)があります。これをコードでどのように記述したらよいでしょうか。たとえば、Religion クラスを取得し、そこから他の宗教を継承することができます。不要なものを抽象化して、Religion クラスで 1 つの 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 нет, это не важно, главное достичь нирваны :)");
    };
}
そして、多くの宗教があり、パスタの怪物(パスタファリアン主義)さえ信じているので、これらすべての宗教において、信じる方法を再定義する必要があります。しかし、別の方法で、このメソッドを 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("Я верю в Бога-творца этого мира");
    }
}
ここではデフォルトのメソッドを実装してもあまり役に立ちません。宗教が非常に多いため、このメソッドを信仰インターフェースでデフォルトで定義したとしても、すべての非一神教の宗教で独自の方法でこのメソッドを実装し、それを繰り返す必要があります。どこかで。 この場合、Strategy パターンは何を提供しますか。 現在のインターフェイス用に既製のテンプレート クラスを作成し、それを特定の宗教のコンストラクターに置き換えることを提案します。それらの。定義の冒頭で述べたのと同じアルゴリズムのファミリーを定義して作成します。
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