5

これは TemplateMethod パターンの例ですか??

public abstract class Character{

    public final void useWeapon(){
        useBusterSword();
        useMateriaBlade();
        useUltimateWeapon();
    }

    public abstract void useBusterSword();
    public abstract void useMateriaBlade();
    public abstract void useUltimateWeapon();
}

public class Cloud extends Character{

    public void useUltimateWeapon() {
        System.out.println("Change Weapon to Ultima Weapon");
    }


    public void useBusterSword() {

    }


    public void useMateriaBlade() {

    }
}


public class TestGame {
    public static void main(String[] args){
        Character cloud = new Cloud();
        cloud.useWeapon();
    }
}

もしそうなら、戦略パターンよりもこのパターンを使用する利点は何ですか??

戦略パターン

public class Character {
    WeaponBehavior w;
    public void setWeaponBehavior(WeaponBehavior wb){
        w = wb;
    }

    public void useWeapon(){
        w.useWeapon();
    }
}

public class Cloud extends Character{

    public Cloud(){
        w = new UltimaWeapon();
    }

}


public interface WeaponBehavior {
    public void useWeapon();
}

public class UltimaWeapon implements WeaponBehavior {
    public void useWeapon() {
        System.out.println("Change Weapon to UltimaWeapon");
    }

}

public class BusterSword implements WeaponBehavior {
    public void useWeapon() {
        System.out.println("Change Weapon to MateriaBlade");
    }

}

public class MateriaBlade implements WeaponBehavior {
    public void useWeapon() {
        System.out.println("Change Weapon to MateriaBlade");
    }

}

public class TestGame {
    public static void main(String[] args){
        Character c = new Cloud();
        c.useWeapon();
    }
}

私が気づいたのは、TemplateMethod パターンとは異なり、Strategy パターンは変化するものをカプセル化して、サブクラス化されたものが変化するものを処理できるようにすることです。

4

4 に答える 4

3

Strategypattern はアルゴリズムのファミリを定義し、それらを交換可能にします。アルゴリズムはカプセル化されているため、クライアント コードはさまざまなアルゴリズムを使用できます。

Templateメソッドは、アルゴリズムの概要を定義し、サブクラスをアルゴリズムの実装の一部にします。したがって、アルゴリズムのステップをさまざまに実装できますが、アルゴリズムの構造は保持できます。

ご覧のとおり、パターンごとに意図が異なります。したがって、どちらが有利かという問題ではありません。

于 2012-04-30T09:26:56.787 に答える
2

はい、テンプレート メソッドの代わりに戦略パターンを使用できますが、特殊なケースでは、アルゴリズム ロジックを繰り返します。

特定の実装によって一部の抽象メソッドを置き換えるテンプレート メソッドの最適な使用例。

例: 料理をしたいのですが、レシピは次のとおりです。

  1. 成分を取る
  2. それらを入れる
  3. 調理済みの食べ物をsmbdに与える

Javaレシピでは、一部のRecipeクラスのメソッドにすぎません

void cook(){
  takeIngridients();
  putIt();  // abstract
  heat();  //abstract
  giveFood();
}

PanRecipeクラス extendsを作成Recipeし、pan を使用する抽象メソッドを実装します。GrillRecipe別のクラスは、グリルを使用するメソッドを実装できます。これで、で呼び出すことができ、戦略パターンの代わりに、繰り返されるメソッドとgrillRecipe.cook()の実装をコピーする必要がなくなりました。takeIngridientsgiveFood

于 2012-04-29T21:58:31.303 に答える
1

テンプレートメソッドパターンは、親クラスのフィールドを使用したい場合や、実装が実際にはアルゴリズム全体ではなく、クラスの階層に非常に固有の「ロジック」のみである場合に役立ちます。

一方、テンプレート メソッドの実装が冗長であるか、同じツリーの複数のサブクラス間でコードが重複していることが判明した場合は、コードが因数分解されるように戦略パターンを選択してください。

また、テンプレート メソッドはサブクラス化によって動作するため、実行時に動作を変更することはできませんが、ストラテジー パターンでは、必要なときにいつでもセッターを使用して動作を変更するだけです。

他のすべてのケースでは、これら 2 つのパターンは非常に似ており、多くの場合、好きな方を選択できます。

于 2012-04-29T21:43:13.800 に答える