毎日少し設計モード-ポリシーモードを学びます


ポリシー・モード
英語名
Strategy pattern
定義#テイギ#
アルゴリズムファミリーを定義し、それぞれカプセル化して互いに置き換えることができます.このモードは、アルゴリズムを使用するお客様とは独立したアルゴリズムの変化をもたらします.
設計の原則
1.アプリケーションに必要とされる可能性のある変化点を見つけ、彼らを独立させ、変化を必要としないコードと混同しないでください.
2.実装プログラミングではなく、インタフェースプログラミング.
3.コンビネーションを多用し、継承を少なくする.
理解する
3つのコンポーネント:抽象ポリシークラス、具体的なポリシークラス、環境クラス.環境クラスにはポリシーインタフェースの参照が含まれています.
コード#コード#
アヒル
public abstract class Duck {
	protected FlyBehavior flyBehavior;
	protected QuackBehavior quackBehavior;

	public Duck() {
	}

	public abstract void diplay();

	public void performFly() {
		flyBehavior.fly();
	}

	public void perormQuack() {
		quackBehavior.quack();
	}

	public void swim() {
		System.out.println("All ducks float,even decoys!");
	}

	public void setFlyBehavior(FlyBehavior fb) {
		flyBehavior = fb;
	}

	public void setQuackBehavior(QuackBehavior qb) {
		quackBehavior = qb;
	}
}

インタフェース:フライング動作フライング動作
public interface FlyBehavior {
	public void fly();
}

飛行行為を実現するクラス:飛べない
public class FlyNoWay implements FlyBehavior {

	/* (non-Javadoc)
	 * @see com.sprd.pattern.part1.FlyBehavior#fly()
	 */
	@Override
	public void fly() {
		// TODO Auto-generated method stub
		System.out.println("I can't fly!");
	}

}

翼で飛ぶ
public class FlyWithWings implements FlyBehavior {

	/* (non-Javadoc)
	 * @see com.sprd.pattern.part1.FlyBehavior#fly()
	 */
	@Override
	public void fly() {
		// TODO Auto-generated method stub
		System.out.println("I'm flying!");
	}

}

ロケットで飛ぶ
public class FlyRocketPowered implements FlyBehavior {

	/* (non-Javadoc)
	 * @see com.sprd.pattern.part1.impl.FlyBehavior#fly()
	 */
	@Override
	public void fly() {
		System.out.println("I'm flying with a rocket!");

	}

}

インタフェース:発声動作
public interface QuackBehavior {
	public void quack();
}

発声インタフェースを実装するクラス:
叫ばない
public class MuteQuack implements QuackBehavior {

	/* (non-Javadoc)
	 * @see com.sprd.pattern.part1.QuackBehavior#quack()
	 */
	@Override
	public void quack() {
		// TODO Auto-generated method stub
		System.out.println("<< Silence >>");
	}
}

ゴーゴーと鳴く
public class Quack implements QuackBehavior {

	/* (non-Javadoc)
	 * @see com.sprd.pattern.part1.QuackBehavior#quack()
	 */
	@Override
	public void quack() {
		// TODO Auto-generated method stub
		System.out.println("Quack");
	}

}

キーキー鳴く
public class Squeak implements QuackBehavior {

	/* (non-Javadoc)
	 * @see com.sprd.pattern.part1.QuackBehavior#quack()
	 */
	@Override
	public void quack() {
		// TODO Auto-generated method stub
		System.out.println("Squeak");
	}

}

上の2のスーパークラスで形成されたアヒルを組み合わせます.
緑頭アヒル
public class MallardDuck extends Duck {

	public MallardDuck(){
		flyBehavior = new FlyWithWings();
		quackBehavior = new Quack();
	}
	@Override
	public void diplay() {
		System.out.println("I'm a real Mallard duck!");
	}
}

アヒルの模型
public class ModelDuck extends Duck {

	public ModelDuck(){
		flyBehavior = new FlyNoWay();
		quackBehavior = new Quack();
	}
	@Override
	public void diplay() {
		System.out.println("I'm a model duck!");

	}

}

試験手順:
public class MiniDuckSimulator {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Duck mallard = new MallardDuck();
		mallard.perormQuack();
		mallard.performFly();
		
		Duck model = new ModelDuck();
		model.performFly();
		model.setFlyBehavior(new FlyRocketPowered());
		model.performFly();
	}

}

結果
Quack
I'm flying!
I can't fly!
I'm flying with a rocket!