《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();}}