背景:实现不同种群鸭子的一些行为,有会飞的,有不会飞的,有会叫的,又不会叫的。在多用组合,少用继承的前提下。进行编码。“有一个“可能比“是一个”更好,由此可得,抽象类,看视为一个类,而接口,看作是这个类的‘行为’。
将飞行和叫两个行为定义为两个接口,接口有一些不同的实现行为, 然后让抽象 Duck去实现这些接口。实体类Duck实现抽象类。这样,就为不同实体赋予了不同方法。
public abstract class Duck { abstract void display(); }
public interface FlyBehavior { void fly(); }
public class FlyNoWays implements FlyBehavior { public void fly() { System.out.println("can not fly"); } }
public class FlyWithWings implements FlyBehavior { public void fly() { System.out.println("Fly With Wings"); } }
public interface QuackBehavior { void quack(); }
public class MuteQuack implements QuackBehavior { public void quack() { System.out.println("I cant not quack"); } }
public class DuckModel extends Duck { FlyBehavior flyBehavior = new FlyNoWays(); QuackBehavior quackBehavior = new MuteQuack(); void display() { System.out.println("I am beautify"); } }
以上,不将fly 和 quack 定义为duck自有的属性,而是将其定义为外界赋予它的属性。
可随时变化。(面向接口编程)