Strategy Pattern


もっと読む
買った最初のhead firstシリーズの本――Head First Design Patternsはついに読み始めました.今日は第一のパターンを読み終わりました.Strategy Pattern:定義されたアルゴリズムクラスタはそれぞれカプセル化して、彼らの間でお互いに交換できます.このモードはアルゴリズムの変化をアルゴリズムを使うクライアントと独立させます.
     本の中の例はとても経典的で、この章を見終わった後に、本の中の例を自分でくまなく書いて、策略のモードの使用を練習しました.以下はコードです.
アヒル類は、飛ぶことができます.
package pro.pattern.strategy.example.duck;

import pro.pattern.strategy.example.duck.flybehavior.FlyBehavior;
import pro.pattern.strategy.example.duck.quackbehavior.QuackBehavior;

public abstract class Duck {
	FlyBehavior flyBehavior;
	
	QuackBehavior quackBehavior;
	
	public Duck(){
		
	}
	
	public abstract void display() ;
	
	public void performFly() {
		flyBehavior.fly();
	}
	
	public void performQuack(){
		quackBehavior.quack();
	}
	
	public void setFlyBehavior(FlyBehavior fly){
		flyBehavior = fly;
	}
	
	public void setQuackBehavior(QuackBehavior quack){
		quackBehavior = quack;
	}
}
 アヒルの種類が多いので、その飛行は違っています.飛行と鳴き声はそれぞれアルゴリズムクラスタと定義できます.
 飛行挙動:
//      
package pro.pattern.strategy.example.duck.flybehavior;

public interface FlyBehavior {
	public void fly();
}


package pro.pattern.strategy.example.duck.flybehavior;

public class FlyNoWay implements FlyBehavior {

	@Override
	public void fly() {
		System.out.println("I can't fly!");
	}

}


package pro.pattern.strategy.example.duck.flybehavior;

public class FlyWithWings implements FlyBehavior{

	@Override
	public void fly() {
		System.out.println("I'm flying!");
	}

}
 
叫び声の行為:
package pro.pattern.strategy.example.duck.quackbehavior;

public interface QuackBehavior {

	public void quack();

}


package pro.pattern.strategy.example.duck.quackbehavior;

public class Quack implements QuackBehavior {

	@Override
	public void quack() {
		System.out.println("Quack");
	}

}


package pro.pattern.strategy.example.duck.quackbehavior;

public class MuteQuack implements QuackBehavior {

	@Override
	public void quack() {
		System.out.println("Mute Quack");
	}

}


package pro.pattern.strategy.example.duck.quackbehavior;

public class Squack implements QuackBehavior {

	@Override
	public void quack() {
		System.out.println("Squack");
	}

}
 アルゴリズムクラスタを定義したら、具体的なアヒル類を定義できます.
package pro.pattern.strategy.example.duck;

import pro.pattern.strategy.example.duck.flybehavior.FlyNoWay;
import pro.pattern.strategy.example.duck.quackbehavior.Squack;

public class ModelDuck extends Duck {

	@Override
	public void display() {
		System.out.println("Just a strategy pattern demo!");
	}
	
	public ModelDuck () {//   ,    
		flyBehavior = new FlyNoWay();
		
		quackBehavior = new Squack();
	}

}
 
テスト:
package pro.pattern.strategy.example.duck;

import pro.pattern.strategy.example.duck.flybehavior.FlyWithWings;
import pro.pattern.strategy.example.duck.quackbehavior.MuteQuack;

public class Test {
	public static void main(String[] args){
		Duck duck = new ModelDuck();
		
		duck.performFly();
		duck.performQuack();
		//         
		duck.setFlyBehavior(new FlyWithWings());
		duck.setQuackBehavior(new MuteQuack());
		
		duck.performFly();
		duck.performQuack();
	}

}
  本で学んだ設計原則:
   パッケージの変化
   多用途グループ、少用引継ぎ