May 05, 2003

Warcraft3でデザインパターン: Template Method

[ Java ]
デザインパターンの勉強を兼ねて、Warcraft III の世界を使ってデザインパターンを実装してみようのコーナー。第一回目は簡単なところからということで、Template Method。言語は Java を選択。

まず、AbstractClass として AbstractHero.java。ヒーローをあらわす抽象クラス。showStatus()メソッドがTemplate Method になっている。
package template_method;

public abstract class AbstractHero {
    public abstract String getName();
    public abstract String[] getAbilities();
    public abstract void doUltimateAbilitiy();

    public final void showStatus() {
        System.out.println("名前: " + this.getName());
	
        String[] abi = getAbilities();
        for (int i = 0; i < abi.length; i++){
            System.out.println("アビリティ" + i + ": " + abi[i]);
        }
		
        this.doUltimateAbilitiy();
    }
}
次に、ConcreteClass として、二つのヒーローを実装してみた。一つ目は MountainKing.java。
package template_method;

public class MountainKing extends AbstractHero {
    private String name;
    private String[] abilities;
	
    public MountainKing() {
        this.name = "Mountain King";
        this.abilities = new String[3];
		
        abilities[0] = "Bash";
        abilities[1] = "Storm Bolt";
        abilities[2] = "Thunder Clap";
    }

    public String getName() {
        return name;
    }

    public String[] getAbilities() {
        return abilities;
    }

    public void doUltimateAbilitiy() {
        System.out.println("Avatarに変身するよ");
    }
}
もう一つのヒーローは、BladeMaster.java。
package template_method;

public class BladeMaster extends AbstractHero {
    private String name;
    private String[] abilities = new String[3];
	
    public BladeMaster() {
        name = "Blade Master";	

        abilities[0] = "Wind Walk";
        abilities[1] = "Mirror Image";
        abilities[2] = "Critical Strike";
    }

    public String getName() {
        return name;
    }

    public String[] getAbilities() {
        return abilities;
    }

    public void doUltimateAbilitiy() {
        System.out.println("Bladestormで雑魚は一毛打尽だ。");
    }
}
これらを利用するClientとしてMain.java
package template_method;

public class Main {
    public static void main (String[] args) {
        AbstractHero h1 = new MountainKing();
        AbstractHero h2 = new BladeMaster();
	
        h1.showStatus();
        h2.showStatus();
    }
}
実行結果は以下。
名前: Mountain King
アビリティ0: Bash
アビリティ1: Storm Bolt
アビリティ2: Thunder Clap
Avatarに変身するよ
名前: Blade Master
アビリティ0: Wind Walk
アビリティ1: Mirror Image
アビリティ2: Critical Strike
Bladestormで雑魚は一毛打尽だ。
スーパークラスがコントロールする多様性が実現できました
Posted by naoya at May 5, 2003 02:08 AM | トラックバック (0)  b_entry.gif
トラックバック [0件]
TrackBack URL: http://mt.bloghackers.net/mt/suck-tbspams.cgi/61
コメント [0件]