《Head First 设计模式》之策略(四)
来源:互联网 发布:大学生软件培训就业 编辑:程序博客网 时间:2024/05/16 17:21
动态设定行为
①、在Duck类中,加入两个新方法。从此以后,我们可以调用这个方法改变鸭子的行为。
// 动态设定行为public void setFlyBehavior(FlyBehavior fb){flyBehavior = fb;}public void setQuackBehavior(QuackBehavior qb){quackBehavior = qb;}
②、制造一个新的鸭子类型:模型鸭(ModelDuck.java)
// 模型鸭public class ModelDuck extends Duck{public ModelDuck(){// 开始时,模型鸭不会飞flyBehavior = new FlyNoWay();quackBehavior = new Quack();}@Overridepublic void display() {System.out.println("I'm a model duck");}}
③、建立一个新的FlyBehavior类型(FlyRocketPower.java)
// 火箭动力飞行public class FlyRocketPower implements FlyBehavior{@Overridepublic void fly() {System.out.println("I'm flying with a rocket");}}
④、改变测试类(DuckSimulator.java),加上模型鸭,并使模型鸭具有火箭动力。
public class DuckSimulator{public static void main(String[] args){Duck mallard = new MallardDuck();mallard.performFly();mallard.performQuack();// 动态绑定行为测试System.out.println("动态绑定行为测试:");Duck model = new ModelDuck();model.performFly();model.setFlyBehavior(new FlyRocketPower());model.performFly();}}
结果:
I'm flying
Quack
动态绑定行为测试:
I can't fly
I'm flying with a rocket
封装行为的全局观
描述事情方式稍有改变,不再把鸭子的行为说成是“一组行为”,开始把行为想成是多种(计算)策略。
策略代表鸭子能做的事(不同的叫法和飞法),这样的做法也能容易地用于用一群类计算不同超市(销售策略各异)的销售金额情况。
“有一个”可能比“是一个”更好
图中包含3种关系——IS-A(是一个)、HAS-A(有一个)、IMPLEMENTS(实现),能分清吗?
“有一个”关系的优势:每一鸭子都有一个FlyBchavior和
一个Quackachavior,好将飞行和呱呱叫委托给它们代为处
理。
当构成“有一个”关系时,如同本例一般,这就是组
合(composition)。这种做法和“继承”不同的地方在于
鸭子的行为不是继承来的,而是和适当的行为对象“组
合”来的。
这是一个很重要的技巧。也是我们使用的第三个设计原则:多用组合,少川继承。
- 《Head First 设计模式》之策略(四)
- 《head first 设计模式》之策略模式
- 《Head First设计模式》之策略模式
- 《Head First 设计模式》之策略模式
- 《Head First设计模式》之策略模式
- 《Head First设计模式》之策略模式
- 《Head First 设计模式》之策略模式
- Head First 设计模式之策略模式(Strategy Pattern)
- 《Head First 设计模式》之策略(一)
- 《Head First 设计模式》之策略(二)
- 《Head First 设计模式》之策略(三)
- java设计模式-Head First设计模式之策略模式
- 《Head First设计模式》要点(四)
- Head First 之 策略模式
- 《Head First 设计模式》读书笔记之1:设计模式入门(策略模式)
- 《Head First设计模式》读书笔记之策略模式
- Head First设计模式笔记之策略模式
- 《Head First 设计模式》读书笔记之策略模式
- Building 32-bit Wine on a 64-bit (x86-64) CentOS
- android Intent.ACTION使用
- Javascript关于页面返回的相关操作
- Linux常用命令(不断更新中)
- Linux软件包组的选择
- 《Head First 设计模式》之策略(四)
- java中使用Json数据
- nginx配置的目录注意问题
- org.hibernate.hql.internal.ast.ErrorCounter reportError
- POJ 1157 LITTLE SHOP OF FLOWERS
- 创建mysql数据表时,字段的int类型长度问题
- Ext load
- 一个使用JS原型的图片滚动类
- 这个世界有病,我们都有病