《head first》学习札记之一

《head first》学习笔记之一
《head first》学习笔记
设计原则

第一个设计原则:
找出应用中可能需要变化之处,把他们独立出来“封装”,不要和那些不需要变化的代码混在一起。
如:将Duck类的fly()和quack()行为独立出来。

第二个设计原则:
针对接口编程,而不是针对实现编程。
将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();
		
	}
}