一个简单多态的例子:
假设有一个抽象类Animal,有两个具体实现(Dog和Cat)集成Animal
#### 针对实现编程
Dog dog = new Dog(); // 类型声明d为Dog类型,会造成必须针对具体实现编程
d.bark(); // bark:叫声的一种
#### 针对借口编程如下
Animal animal = new Animal();
animal.makeSound(); // 利用animal进行多态调用
更棒的是,子类实例化的动作不再需要在代码中硬编码,而是“在运行时才指定具体实现的对象”,例如:
a = getAnimal();
a.makeSound();
整合的代码:
// FlyBehavior.java
public interface FlyBehavior {
public void fly();
}
// FlyWithWings.java
public class FlyWithWings implements FlyBehavior {
public void fly() {
System.out.println("I am flying!");
}
}
// FlyNoWay.java
public class FlyNoWay implements FlyBehavior {
public void fly() {
System.out.println("I can't fly!");
}
}
// QuackBehavior.java
public interface QuackBehavior {
public void quack();
}
// Quack.java
public class Quack implements QuackBehavior {
public void quack() {
System.out.println("Quack");
}
}
// MuteQuack.java
public class MuteQuack implements QuackBehavior {
public void quack() {
System.out.println("<< Silence >>);
}
}
// Squeak.java
public class Squeak implements QuackBehavior {
public void quack() {
System.out.println("Squeak");
}
}
// Duck.java
public abstract class Duck {
FlyBehavior flyBehavior; // 为行为接口类型声明两个引用变量,所有鸭子子类都继承他们
QuackBehavior quackBehavior;
public Duck() { }
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!");
}
}
// MallardDuck.java
public class MallardDuck extends Duck {
public MallardDuck() {
quackBehavior = new Quack();
flyBehavior = new FlyWithWings();
}
public void display() {
System.out.println("I am a real Mallard duck");
}
}
// Output
bovenson@ThinkCentre:/home/public/Git/notes/DesignPattern/Code$ javac MiniDuckSimulator.java && java MiniDuckSimulator
Quack
I am flying!
public abstract class Duck {
FlyBehavior flyBehavior; // 为行为接口类型声明两个引用变量,所有鸭子子类都继承他们
QuackBehavior quackBehavior;
public Duck() { }
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 void setFlyBehavior(FlyBehavior fb) { // 动态设定行为
flyBehavior = fb;
}
public void setQuackBehavior(QuackBehavior qb) { // 动态设定行为
quackBehavior = qb;
}
}
添加:
ModelDuck.java
FlyRocketPowered.java
// ModelDuck.java
public class ModelDuck extends Duck {
public ModelDuck() {
flyBehavior = new FlyNoWay();
quackBehavior = new Quack();
}
public void display() {
System.out.println("I'm a model duck");
}
}
// FlyRocketPowered.java
public class FlyRocketPowered implements FlyBehavior {
public void fly() {
System.out.println("I'm flying with a rocket!");
}
}
修改MiniDuckSimulator.java
public class MiniDuckSimulator {
public static void main(String args[]) {
Duck mallard = new MallardDuck();
mallard.performQuack();
mallard.performFly();
Duck model = new ModelDuck();
model.performFly();
model.setFlyBehavior(new FlyRocketPowered()); // 动态设定行为
model.performFly();
}
}
输出:
bovenson@ThinkCentre:/home/public/Git/notes/DesignPattern/Code$ cd "/home/public/Git/notes/DesignPattern/Code/Char0/" && javac MiniDuckSimulator.java && java MiniDuckSimulator
Quack
I am flying!
I can't fly!
I'm flying with a rocket!