某些子类需要增加新的方法。案例:
marvel里的每个英雄都有超能力,他们的父类叫变种人Mutant,每个英雄都从父类继承了superPower(),现在某些英雄
(IceMan、Shadowcat、Wolverine.etc)要添加新的超能力performFly,Storm不需要,暴风女本来就有此能力。
一是使用继承,在父类添加新方法,但这样会让所有子类都添加了新方法(虽然可以通过overriding子类新方法并在方法体留空,但未来如果有新子类加入,仍需要重复这项工作)。
二是使用接口,在接口里添加新方法,让有需要的子类实现该接口,缺点是破坏行为封装:接口只声明了新
的方法,并没有实现代码,也就失去了代码重用的优势。
设计模式可以解决以上问题。All patterns provide a way to let some part of a system vary independently
of all other parts.
新的超能力单独成为一个类,并且在需要新超能力的英雄类里动态改变他们的行为。
我们使用接口来代表新的能力,FlyBehavior,当然,不在英雄类的实现这个接口,这意味着重复代码,而是单独实现一个行为类flying。
这样一来便解决了代码重用的问题。
这里插入polymorphism的概念:
Wolverine w = new Wolverine();
w.longevity();
假设abstract class Mutant,该抽象类定义了superPower(),由实现了该类的IceMan、Wolverine实现具体的superPower()方法,调用时由Mutant实例多态地引用:
Mutant mutant = new Wolverine();
mutant.superPower();
比new Dog()这种硬编码更好的实现方法是:
Mutant mutant = getMutant();
mutant.superPower();
我们不需要知道确切是哪种动物,工作集中于makeSound()的实现。
通过接口,可以方便地实现多态,在运行时动态地改变行为。
1.创建FlyBehavior接口,方法是fly();
2.创建FlyWithWings类,实现FlyBehavior接口;
3.在Wolverine类里动态地决定FlyBehavior,
public void setFlyBehavior(FlyBehavior fb){
flyBehavior = fb;
}
public void performFly(){
flyBehavior.fly();
}
4.实际调用时wolverine.setFlyBehavior(new FlyWithWings());
不同的飞行能力相当于不同的算法,同理,可以将不同国家不同的税率计算同样以接口方法动态设置。