public abstract class Duck{ public void quack(){ //呱呱叫 System.out.println("呱呱叫"); } public void swim(){ //游泳 System.out.println(" 游泳"); } public abstratact void display(); /*因为外观不一样,让子类自己去决定了。*/ }对于它的子类只需简单的继承就可以了,并实现自己的display()方法。
//野鸭 public class MallardDuck extends Duck{ public void display(){ System.out.println("野鸭的颜色..."); } } //红头鸭 public class RedheadDuck extends Duck{ public void display(){ System.out.println("红头鸭的颜色..."); } }
public abstract class Duck{ public void quack(){ //呱呱叫 System.out.println("呱呱叫"); } public void swim(){ //游泳 System.out.println(" 游泳"); } public abstract void display(); /*因为外观不一样,让子类自己去决定了。*/ public void fly(){ System.out.println("飞吧!鸭子"); } }对于不能飞的鸭子,在子类中只需简单的覆盖。
//残废鸭 public class DisabledDuck extends Duck{ public void display(){ System.out.println("残废鸭的颜色..."); } public void fly(){ //覆盖,变成什么事都不做。 } }
public interface Flyable{ public void fly(); } public interface Quackable{ public void quack(); }最后Duck的设计成为:
public abstract class Duck{ public void swim(){ //游泳 System.out.println(" 游泳"); } public abstract void display(); /*因为外观不一样,让子类自 己去决定了。*/ }而MallardDuck,RedheadDuck,DisabledDuck 就可以写成为:
//野鸭 public class MallardDuck extends Duck implements Flyable,Quackable{ public void display(){ System.out.println("野鸭的颜色..."); } public void fly(){ //实现该方法 } public void quack(){ //实现该方法 } } //红头鸭 public class RedheadDuck extends Duck implements Flyable,Quackable{ public void display(){ System.out.println("红头鸭的颜色..."); } public void fly(){ //实现该方法 } public void quack(){ //实现该方法 } } //残废鸭 只实现Quackable(能叫不能飞) public class DisabledDuck extends Duck implements Quackable{ public void display(){ System.out.println("残废鸭的颜色..."); } public void quack(){ //实现该方法 } }
public interface FlyBehavior{ public void fly(); } public interface QuackBehavior{ public void quack(); }我们在定义一些针对FlyBehavior的具体实现。
public class FlyWithWings implements FlyBehavior{ public void fly(){ //实现了所有有翅膀的鸭子飞行行为。 } } public class FlyNoWay implements FlyBehavior{ public void fly(){ //什么都不做,不会飞 } }针对QuackBehavior的几种具体实现。
public class Quack implements QuackBehavior{ public void quack(){ //实现呱呱叫的鸭子 } } public class Squeak implements QuackBehavior{ public void quack(){ //实现吱吱叫的鸭子 } } public class MuteQuack implements QuackBehavior{ public void quack(){ //什么都不做,不会叫 } }
public abstract class Duck{ --------->在抽象类中,声明各接口,定义各接口对应的方法. FlyBehavior flyBehavior;//接口 QuackBehavior quackBehavior;//接口 public Duck(){} public abstract void display(); public void swim(){ //实现游泳的行为 } public void performFly(){ flyBehavior.fly(); -->由于是接口,会根据继承类实现的方式,而调用相应的方法. } public void performQuack(){ quackBehavior.quack();(); } }看看MallardDuck如何实现---->通过构造方法,生成'飞','叫'具体实现类的实例,从而指定'飞','叫'的具体属性。
public class MallardDuck extends Duck{ public MallardDuck { flyBehavior = new FlyWithWings (); quackBehavior = new Quack(); //因为MallardDuck 继承了Duck,所有具有flyBehavior 与quackBehavior 实例变量} public void display(){ //实现 } }
public class Duck{ FlyBehavior flyBehavior;//接口 QuackBehavior quackBehavior;//接口 public void setFlyBehavior(FlyBehavior flyBehavior){ this.flyBehavior = flyBehavior; } public void setQuackBehavior(QuackBehavior quackBehavior { this.quackBehavior= quackBehavior; } }