Head First-策略模式解读
来源:互联网 发布:软件企业认证资质证书 编辑:程序博客网 时间:2024/06/05 20:18
一、概括:
策略模式无论是在大话设计模式中还是在Head First中都是作为前面出现的设计模式,可见它还是相对比较简单的。
策略是行为型的,也就是说它的侧重点在方法上。
二、谈谈认识:
现在通过模拟鸭子的实例,谈谈策略。
第一层:单纯继承
首先,各种鸭子,一边游泳,一边呱呱叫。我们很容易的从中取出类:鸭子;方法:游泳、叫、外观。所以,我们画出来是酱紫的:
代码实现:
/** * @author qmx * @version 1.0 * @created 21-九月-2014 15:44:32 */public abstract class Duck {public Duck(){}public void display(){}public void fly(){}public void queck(){}public void swim(){}}
子类:(只写一个)
/** * @author qmx * @version 1.0 * @created 21-九月-2014 15:44:32 */public class MallardDuck extends Duck {/** * 外观是绿头 */public void display(){}}
第二层:加入接口
光看这个图就挺乱的,我们要记得,接口定义了fly这个方法,但是并没有实现它。MallarDuck和RedheadDuck他们两个fly实现是相同的,这个时候,非要让他们重写接口中的fly方法,这不是又生成了大量的重复代码吗?
因此我们进行进一步整合,通过对父类的引用指向子类对象的方式。
第三层:策略模式
其中要注意的点:
1、各种fly方法继承接口FlyBehavior,封装起来。这样可以达到代码的复用。
2、Duck抽象类中添加成员变量为FlyBehavior flyBeHavior。(如果一个类是另一个类中的成员变量,则这两个类的关系是聚合关系)。这样可以抽象类就可以将fly动作委托给FlyBehavior类了。
3、Duck中setFlyBehavior中的局部参数就是FlyBehavior。这样就实现了动态调用,setFlyBehavior中参数得到的是哪一个fly的子类,就可以调用哪一个了。
4、Duck中performQuack方法,应用了委托,直接调用的是该接口FlyBehavior中的子类的fly对象。
代码:
/** * @author qmx * @version 1.0 * @created 21-九月-2014 16:47:39 */public abstrack class Duck {FlyBehavior flyBehavior; //成员变量QuackBehavior quackBehavior;public Duck(){}public abstract void display(){}public void performQuack(){ flyBehavior.fly(); //将fly动作委托给了FlyBehavior类}public void performQuack(){ quackBehavior.quack();}/** * * @param fb */public void setFlyBehavior(FlyBehavior fb){ fyBehavior = fb; //动态的指向子类对象}/** * * @param qb */public void setQuackBehavior(QuackBehavior qb){ QuackBehavior = qb;}public void swim(){ System.out.println("All ducks float, even decoys!");}}
子类继承父类(只写一个):
/** * @author qmx * @version 1.0 * @created 21-九月-2014 16:47:40 */public class MallardDuck extends Duck { public MallardDuck(){ flyBehavior = new FlyNoWay(); quackBehavior = new Quack(); } public void display(){ System.out.println("I'm a mallard duck!"); }}
接口FlayBehavior:
/** * @author qmx * @version 1.0 * @created 21-九月-2014 16:47:39 */public interface FlyBehavior {public void fly();}
实现接口的FlyRocketPowered(只写一个):
/** * @author qmx * @version 1.0 * @created 21-九月-2014 16:47:40 */public class FlyWithWings implements FlyBehavior {public void fly(){ System.out.println("I'm flying with my wings!");}}
这样写客户端调用时:
Duck mallard = new MallardDuck(); <pre name="code" class="java"> mallard.performFly(); //为“I'm not fly!”mallard.setFlyBehavior(new FlyWithWings()); mallard.performFly(); //为“I'm flying with my wings!”
三、总结
之前设计模式中的策略其实在机房收费系统中的结账的时候,用策略+职责链一起用过,在职责链的强大阵容下,策略显得总是有点微小,心想是不是可以不用总结了,看似好像会了,但实际上,这篇博客用java的语言从新再写一边的时候,觉得学习到了很多。
感想就是:知识当你看过一遍觉得你都会了的时候,其实你只回了20%到30%;当你动手做了一遍的时候,其实你会了50%;当你思考了,并且总结了,你会了70%到80%;当你和别人分享你的知识,同时不断交流,你就可以说你是大牛了。
- Head First-策略模式解读
- Head First---策略模式
- Head First 策略模式
- Head First 策略模式
- 《Head First-Chapter1》策略模式
- Head First 之 策略模式
- 《head first 设计模式》之策略模式
- head first 设计模式:策略模式
- 策略模式 - head first设计模式
- Head First 设计模式第一章 ----策略模式
- 《Head First设计模式》策略模式
- Head First设计模式-策略模式
- 【Head First设计模式】策略模式
- 《Head First 设计模式》策略模式
- 《Head First设计模式》之策略模式
- Head First 设计模式:1策略模式
- 《Head First 设计模式》之策略模式
- <Head First 设计模式>:策略模式--Duck
- Qt常用快捷方式(精简自留款)
- iOS/Android/WAP 全兼容专题页面制作方法(一)
- 处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”
- Java读取指定路径下的文件列表
- 数据结构 第二章 线性表 思维导图
- Head First-策略模式解读
- 《数据结构》实验一:VC编程环境的灵活应用
- 常见算法在实际项目中的应用
- 数据结构(C实现)------- 顺序队列(循环队列之少用一个存储空间实现) .
- Struts2文件的上传、下载之二
- 数据结构 成绩表的ADT
- memcache分布式缓存
- 【新东郊商城】周年店庆 关注微信,转发微博抽奖品!玩赚乐不停
- JVM处理Java数组方法的思考