//抽象类, 用于被其他子类继承, 重写其中的方法 public abstract class Duck { //生成两个接口的实例变量 FlyBehavior flyBehavior; QuackBehavior quackBehavior; //初始化方法 public Duck() {
} //接口变量的set方法 public void setFlyBehavior(FlyBehavior fb) { flyBehavior = fb; } public void setQuackBehavior(QuackBehavior qb) { quackBehavior = qb; } public abstract void display(); public void performFly() { flyBehavior.fly(); //执行动态绑定的地方 } public void performQuack() { quackBehavior.quack(); }
public void swim() { System.out.println("All ducks float, even decoys!"); }
} //定义一个接口 public interface FlyBehavior { public void fly(); //接口中的方法并不进行具体实现 } //类对接口的具体实现 public class FlyNoWay implements FlyBehavior { public void fly() { System.out.println("I can't fly!"); } } public class FlyWithWings implements FlyBehavior { //实现接口的具体类 public void fly() { System.out.println("I'm flying !"); } } //定义另一个接口 public interface QuackBehavior { public void quack(); //接口中的方法并不具体实现 } //类实现具体的接口 public class MuteQuack implements QuackBehavior { public void quack() { System.out.println("<<MuteQuack!>>"); } } public class Quack implements QuackBehavior { public void quack() { System.out.println("Quack!"); } } public class Squeak implements QuackBehavior { public void quack() { System.out.println("Squeak!"); } }
public class MallardDuck extends Duck { public MallardDuck() { //分别给两个接口变量, 赋值需要的类实例 quackBehavior = new Quack(); flyBehavior = new FlyWithWings(); } public void display() { System.out.println("I'm a real Mallard duck!"); } }
//测试类 public class MiniDuckSimulator { public static void main(String[] args) { //调用MallardDuck类中的构造方法进行接口变量的初始化 Duck mallard = new MallardDuck(); //获得一个类实例 /* 此处类实例赋值给Duck变量, 直到运行时才知道Duck中 具体的对象类型, 得到MallarDuck类, 然后运行下面两个已 经在MallardDuck中赋值的两个接口类的实例 */ mallard.performFly(); //真正执行的是FlyWithWings类中中fly方法 mallard.performQuack(); //真正执行的是Quack类中的quack方法 } }