策略模式

某些子类需要增加新的方法。案例:
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());
不同的飞行能力相当于不同的算法,同理,可以将不同国家不同的税率计算同样以接口方法动态设置。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值