『head first』学習ノートの一つ


『head first』学習ノート
せっけいげんり
第一の設計原則:
アプリケーションに変化が必要な可能性のある点を見つけ、独立して「カプセル化」し、変化を必要としないコードと混同しないでください.
例えば、Duckクラスのfly()とquack()の動作を独立させる.
2つ目の設計原則:
実装プログラミングではなく、インタフェースに対してプログラミングを行います.
flyとquackをそれぞれインタフェースとして設計し、Duckクラスはインタフェースを実装するのではなく、他のクラスを個別に製造してインタフェースを実装し、このクラスは「動作クラス」と呼ばれ、Duckクラスではなく動作クラスによって動作インタフェースを実現する.

package net.roky.pattern.first;

public interface FlyBehavior {
	public void fly();
}

package net.roky.pattern.first;

public class Fly1 implements FlyBehavior {
	public void fly(){
		System.out.println("I can fly with wings.");
	}
}

package net.roky.pattern.first;

public class Fly2 implements FlyBehavior {
	public void fly() {
		System.out.println("I can't fly.");
	}
}

package net.roky.pattern.first;

public class Fly3 implements FlyBehavior {

	public void fly() {
		System.out.println("I can fly with rocket.");

	}

}

package net.roky.pattern.first;

public interface QuackBehavior {
	public void quack();
}

package net.roky.pattern.first;

public class Quack1 implements QuackBehavior {

	public void quack() {
		System.out.println("gaga...gaga..");
	}

}

package net.roky.pattern.first;

public class Quack2 implements QuackBehavior{
	public void quack(){
		System.out.println("gugu...gugu...");
	}
}

package net.roky.pattern.first;

public abstract class Duck {
	FlyBehavior flyBehavior;
	QuackBehavior quackBehavior;
	
	public void setFlyBehavior(FlyBehavior f){
		this.flyBehavior = f;
	}
	
	public void setQuackBehavior(QuackBehavior q){
		this.quackBehavior = q;
	}
	
	public abstract void display();
	
	public void swim(){
		System.out.println("I'm a duck, I can swim.");
	} 
	
	public void performFlyBehavior(){
		flyBehavior.fly();
	}
	
	public void performQuackBehavior(){
		quackBehavior.quack();
	}
}

package net.roky.pattern.first;

public class Duck1 extends Duck{
	public Duck1(){
		System.out.println("Duck1....................");
		super.flyBehavior = new Fly1();
		super.quackBehavior = new Quack2();
	}
	
	public void display(){
		System.out.println("------Duck1");
	}
}

package net.roky.pattern.first;

public class Duck2 extends Duck {
	
	public Duck2(){
		System.out.println("Duck2....................");
		super.flyBehavior = new Fly2();
		super.quackBehavior = new Quack1();
	}

	public void display() {
		System.out.println("------Duck2");
	}

}

package net.roky.pattern.first;

public class Main {
	public static void main(String[] args){
		Duck duck = new Duck1();
		duck.swim();
		//         
		duck.performFlyBehavior();
		duck.performQuackBehavior();
		
		//  setXXX      
		duck.setFlyBehavior(new Fly2());
		duck.setQuackBehavior(new Quack2());
		duck.performFlyBehavior();
		duck.performQuackBehavior();
		
		duck = new Duck2();
		duck.swim();
		//         
		duck.performFlyBehavior();
		duck.performQuackBehavior();
		//  setXXX      
		duck.setFlyBehavior(new Fly3());
		duck.setQuackBehavior(new Quack1());
		duck.performFlyBehavior();
		duck.performQuackBehavior();
		
	}
}