Decorator装飾器モードJava例学習

1893 ワード

子供の時に遊んだゲーム戦車大戦を使って、デザインモードの応用をシミュレーションします。
生まれた時に戦車の弾は壁を通らないで、血の量は1回だけ殴られます。
ランダムに出現する道具を食べたら、何度も血が出てきます。弾の威力も大きくなります。装飾を加えたのと同じです。
まず、共通の戦車を作成します。
public abstract class Tank
{

	public int hp;

	public abstract void attack();

	public int beAttacked(int i)
	{
		return hp -= i * 100;
	};
}
そしてこの汎用戦車に対する変身器です。
public abstract class BianshenTank extends Tank
{
	private Tank tank;

	public BianshenTank(Tank tank)
	{
		this.tank = tank;
	}

	@Override
	public void attack()
	{
		tank.attack();
	}

	@Override
	public int beAttacked(int i)
	{
		return tank.beAttacked(i);
	}
}
出生時の標準戦車を作成します。装飾なし:
public class BornTank extends Tank
{
	public BornTank()
	{
		this.hp = 100;
	}

	@Override
	public void attack()
	{
		System.out.println("bing! beng! ba!");
	}

	@Override
	public int beAttacked(int i)
	{
		return hp -= i * 100;
	}

}
装飾された戦車を加えて、無敵でも壁を通すことができます。
public class Wudi extends BianshenTank
{
	public Wudi(Tank tank)
	{
		super(tank);
		hp = 300;
	}

	@Override
	public void attack()
	{
		super.attack();
		System.out.println("haha, i can chuanqiang");
	}

	@Override
	public int beAttacked(int i)
	{
		System.out.println("haha, i am wudi");
		return hp;
	}
}
次にこの無敵戦車を使うことができます。
Tank t = new BornTank();
Wudi w = new Wudi(t);
w.attack();
System.out.println("my hp is:" + w.beAttacked(200));