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