《head first》学习笔记
设计原则
第一个设计原则:
找出应用中可能需要变化之处,把他们独立出来“封装”,不要和那些不需要变化的代码混在一起。
如:将Duck类的fly()和quack()行为独立出来。
第二个设计原则:
针对接口编程,而不是针对实现编程。
将fly和quack分别设计成接口,Duck类不用实现该接口,而是由单独制造其他类专门实现接口,这个类称为“行为类”由行为类而不是Duck类来实现行为接口。
设计原则
第一个设计原则:
找出应用中可能需要变化之处,把他们独立出来“封装”,不要和那些不需要变化的代码混在一起。
如:将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();
}
}