2014年10月21日火曜日

開発環境

Head Firstデザインパターン ―頭とからだで覚えるデザインパターンの基本 (Eric Freeman 著、Elisabeth Freeman 著、Kathy Sierra 著、Bert Bates 著、佐藤 直生 監訳、木下 哲也 翻訳、有限会社 福龍興業 翻訳、オライリージャパン)の1章(デザインパターン入門: デザインパターンへようこそ)、デザインパズル(p.25)を解いてみる。

その他参考書籍

デザインパズル(p.25)

コード(BBEdit, Emacs)

Character.java

public abstract class Character {
    // Character has a WeaponBehavior.
    WeaponBehavior weapon;
    public Character() {}
    
    public abstract void fight();

    public void performWeapon() {
        weapon.useWeapon();
    }

    public void setWeapon(WeaponBehavior wb) {
        this.weapon = wb;
    }
}

WeaponBehavior.java

public interface WeaponBehavior {
    public void useWeapon();
}

KnifeBehavior.java

public class KnifeBehavior implements WeaponBehavior {
    public void useWeapon() {
        System.out.println("ナイフで切る。");
    }
}

AxeBehavior.java

public class AxeBehavior implements WeaponBehavior {
    public void useWeapon() {
        System.out.println("斧で叩き切る。");
    }
}

SwordBehavior.java

public class SwordBehavior implements WeaponBehavior {
    public void useWeapon() {
        System.out.println("剣を振り下ろす。");
    }
}

BowAndArrowBehavior.java

public class BowAndArrowBehavior implements WeaponBehavior {
    public void useWeapon() {
        System.out.println("弓矢を引く。");
    }
}

Queen.java

public class Queen extends Character {
    public Queen() {
        weapon = new BowAndArrowBehavior();
    }
    public void fight() {
        System.out.println("Queenが戦う。");
    }
}

King.java

public class King extends Character {
    public King() {
        weapon = new KnifeBehavior();
    }
    public void fight() {
        System.out.println("Kingが戦う。");
    }
}

Knight.java

public class Knight extends Character {
    public Knight() {
        weapon = new SwordBehavior();
    }
    public void fight() {
        System.out.println("Knightが戦う。");
    }
}

Troll.java

public class Troll extends Character {
    public Troll() {
        weapon = new AxeBehavior();
    }
    public void fight() {
        System.out.println("Trollが戦う。");
    }
}

入出力結果(Terminal)

$ javac *.java
$ java CharacterSimulator
Kingが戦う。
ナイフで切る。
Knightが戦う。
剣を振り下ろす。
setWeaponで振る舞いを動的に設定。
斧で叩き切る。
$

0 コメント:

コメントを投稿