public abstract class Duck { //所有的鸭子均会叫以及游泳,所以父类中处理这部分代码 public void quack() { System.out.println("Quack"); } public void swim() { System.out.println("All ducks float, even decoys."); } //因为每种鸭子的外观是不同的,所以父类中该方法是抽象的,由子类型自己完成。 public abstract void display(); }
public class MallardDuck extends Duck { //野鸭外观显示为绿头 public void display() { System.out.println("Green head."); } }
public class RedHeadDuck extends Duck { //红头鸭显示为红头 public void display() { System.out.println("Red head."); } }
public class RubberDuck extends Duck { //橡皮鸭叫声为吱吱叫,所以重写父类以改写行为 public void quack() { System.out.println("Squeak"); }
//橡皮鸭显示为黄头 public void display() { System.out.println("Yellow head."); } }
public abstract class Duck { //将变化的行为fly()以及quake()从Duck类中分离出去定义形成接口,有需求的子类中自行去实现
public void swim() { System.out.println("All ducks float, even decoys."); } public abstract void display(); }
//变化的fly()行为定义形成的接口 public interface FlyBehavior { void fly(); }
//变化的quack()行为定义形成的接口 public interface QuackBehavior { void quack(); }
//野鸭子会飞以及叫,所以实现接口 FlyBehavior, QuackBehavior public class MallardDuck extends Duck implements FlyBehavior, QuackBehavior{ public void display() { System.out.println("Green head."); }
public void fly() { System.out.println("Fly."); }
public void quack() { System.out.println("Quack."); } }
//红头鸭子会飞以及叫,所以也实现接口 FlyBehavior, QuackBehavior public class RedHeadDuck extends Duck implements FlyBehavior, QuackBehavior{ public void display() { System.out.println("Red head."); }
public void fly() { System.out.println("Fly."); }
public void quack() { System.out.println("Quack."); } }
//橡皮鸭不会飞,但会吱吱叫,所以只实现接口QuackBehavior public class RubberDuck extends Duck implements QuackBehavior{ //橡皮鸭叫声为吱吱叫 public void quack() { System.out.println("Squeak"); }
//橡皮鸭显示为黄头 public void display() { System.out.println("Yellow head."); } }
public abstract class Duck { //在刚才Duck.java中加入以下二个方法。 public void setFlyBehavior(FlyBehavior flyBehavior) { this.flyBehavior=flyBehavior; } public void setQuackBehavior(QuackBehavior quackBehavior) { this.quackBehavior=quackBehavior; }
//其它方法同,省略... }
测试类:
public class DuckTest { public static void main(String[] args) { Duck duck=new MallardDuck(); duck.performFly(); duck.performQuack(); duck.setFlyBehavior(new FlyNoWay()); duck.performFly(); } }