阅读本文大概需要花费您2分钟
文章内容来自对《Head First 设计模式》第一章,《Android源码设计模式解析与实战》第七章学习总结。
一个概念
- 策略模式:
定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。
三个设计原则
1)** 找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起**
比如鸭子类的叫和飞的行为就属于变化的部分,独立出来后鸭子类可以动态去设置不同的行为。
2)设计接口编程,而不是针对实现编程。
3)多用组合,少用继承
鸭子的行为是多个行为对象组合而来,不是用的继承。
主要讲了创建一个鸭子类,需要飞和叫等行为,动态去改变。
应用示例
- 一个示例:
真实的鸭子:会叫(嘎嘎叫) 会飞 会游泳
橡皮鸭:会叫(吱吱叫),不会飞 不会游泳
诱饵鸭:不会叫 不会飞 不会游泳
··· ···
两种有缺陷实现方式:
(1)继承
存在的问题:
1)代码在多个子类中重复,就算有些鸭子不会嘎嘎叫,仍然要去实现父类的“叫”的方法,但不过是do nothing
2)很难知道鸭子的全部行为,因为有些方法虽然实现却是do nothing
3)运行时行为不易改变
4)改变会牵一发动全身,造成其他鸭子不想要的改变。如果需要鸭子跳舞,父类增加这个方法后,其他所有继承该父类的鸭子
都需要去实现这个方法。就造成了1)和2)的问题。
(2)使用Flyable和Quackable接口,需要此类行为的对象,实现相关接口即可
存在的问题:
1)代码没有办法复用。比如每一个会嘎嘎叫的鸭子对象都需要重新去实现一遍嘎嘎叫的接口。
2)每次新增加一种鸭子类型,就需要检查相关接口是否已经实现。
策略模式实现:
[没学会怎么画uml,继续改进 = =]
代码请见:
https://github.com/chaozaiai/JavaTrain/tree/master/headfirst_mode/chapter01
《Android源码设计模式解析与实战 》
使用场景:
- 针对同一类型问题的多种处理方式,仅仅是具体行为有差别时
- 需要安全的封装多种同一类型的操作时
- 出现同一抽象类有多个子类,而又需要使用if-else后者switch-case来选择具体子类时
android 使用策略模式实现举的例子是Animation(动画)对象。
网友评论