`
esperanza
  • 浏览: 183404 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

策略模式的思考

阅读更多
大虾们见笑了
这是小弟第一次写这种文章
多多指点批评

在HEAD FIRST书中,作者用鸭子的例子来说明策略模式
起初,设计的模型是:有个基类Duck,在基类定了了一个变量:description,用来代表鸭子的外观描述,还定义了一个方法fly().
它的子类Mallard(野鸭),Sarcelle(绿翅鸭),Scaup(白胸鸭)都继承了基类中的变量和方法。
随着业务的深入细化,鸭子需要增加新方法比如blat(),而其又出现了其他类型的鸭子,比如木鸭,塑料鸭,这些玩具鸭子不会fly,但可以blat
这时候就要面临大面积的代码重写
首先:父类中增加了新方法就导致了所有的子类都面临着变动。
其次:有些子类又不具备父类中的所有方法
这就和设计原则中的ocp原则发生了冲突
于是作者提出了策略模式
代码进行了如下的重构:
首先把fly()方法提取出来,作为一个单独的接口IFly,同理blat()方法也作为单独一个接口IBlat
根据鸭子的fly和blat行为分别写实现类
然后在父类中增加2个变量,类型分别为IFlay,IBlat
子类显示父类的fly()方式时,实际上没有独自定义方法,而是根据鸭子的类型调用IFly和IBlat的不同实现
而其为了在运行中改变鸭子的行为,在鸭子子类中增加新2个改变fly和blat行为的方法。setFly(),setBlat()


总结:
虽然初始的设计存着问题。
1.子类必须实现父类的方法,各个子类的fly行为可能相同,这样就无法达到代码的重用了。
2.父类增加新的行为,所有的子类都需要变动

但是在策略模式中,问题2依旧存在,只不过不是给子类增加一个方法,而是必须增加一个新变量

个人感觉,策略模式的精髓在于,把子类中的方法提取出来作为一个接口,与鸭子子类之间形成一种松耦合的关系
通过setFly()方法就可以在运行中动态地改变其行为。

书中说如果方法中存在着if-else这种判断就应用策略模式,这样说有点大,模糊了。反过来我们想想,如果我想在运行中动态
改变对象的行为,是如何实现的。
public void method(String type){
if(type.equal("....")){
....
}else{
....
}
}
那么我们就可以运用策略模式改写
interface IMethod(){
public void method();
}

class MethodOne implements IMethod(){
public void method(){
...
}
}

class MethodTwo implements IMethod(){
public void method(){
...
}
}

public class Test(){
private  IMehtod iMethod;
public Test(IMethod iMethod){
this.iMethod = iMethod;
}
public void setMethod(IMethod iMethod){
this.iMethod = iMethod;
}
public void method(){
iMethod.method();
}
public static void main(String args[]){
IMethod methodOne = new MethodOne();
IMethod methodTwo = new MethodTwo();

Test test = new Test(methodOne);
test.method();
if(....){
test.setMethod(methodTwo);
test.method();
}
}
}

把判断前后的处理方式提取成方法的好处就是解耦合,并达到代码的重用
解耦合可以这样理解,如果日后方法的处理方式又有了其他方式,我们就必须修改所有的子类,再增加一层判断
利用策略模式,我们所要做的就是增加一个新的实现类,这样我的工作就大打减少了。而其代码也容易维护了

这里还有个原则,就是子类继承父类的时候,最好不要增加新的方法,这样子类向父类转型的时候就容易丢失方法
如果说子类非要增加一个父类中不存在的方法,那就需要重新审视自己的代码了,看是否可以考虑使用组合关系

0
0
分享到:
评论
1 楼 esperanza 2009-09-20  
哇哦~~ 真是看不懂耶,还是举着旗子啦啦啦~~

相关推荐

    策略模式引发的一些思考

    策略模式是一种行为设计模式,它使你能在运行时改变对象的行为。在软件开发中,我们经常遇到需要在不同时间或根据不同条件执行不同算法的情况。策略模式提供了一种将算法族封装到各自独立的类中,使得它们可以在同一...

    Java策略模式的使用(枚举策略与简单工厂策略)

    后端同学在开发过程中,势必会遇到多条件判断的情况,大部分时候都会直接采用if-else的形式去处理,这样的操作会存在不易扩展的问题,那么...对比枚举策略与简单工厂+策略模式的不同使用,抛砖引玉,引发你更多的思考

    大盘开发模式及策略思考.pptx

    大盘开发模式及策略思考.pptx

    “C#设计模式”是一本基础概述性及强的设计模式书籍,实例丰富还配有思考题

    第四部分将深入行为型模式,如策略模式、模板方法模式、观察者模式、职责链模式、命令模式、解释器模式、状态模式、访问者模式、迭代器模式和备忘录模式。这些模式着重于对象的行为和交互,帮助我们处理复杂的业务...

    地产大盘开发模式及策略思考.pptx

    地产大盘开发模式及策略思考.pptx

    大盘开发模式及策略思考讲义.pptx

    大盘开发模式及策略思考讲义.pptx

    用设计模式思考 Thinking in Patterns

    《用设计模式思考 Thinking in Patterns》是一本深入探讨软件设计艺术的权威著作,它强调了在编程中应用设计模式的重要性。设计模式是软件开发中经过时间验证的最佳实践,它们是解决常见问题的有效模板,能够帮助...

    房地产大盘开发模式及策略思考.pptx

    房地产大盘开发模式及策略思考.pptx

    思考模式pdf

    思考模式是指人们在面对问题或情境时,习惯性地采用的思维方式和解决问题的策略。这些模式通常是基于个人的经验、知识结构以及社会文化背景形成的。它们可以帮助我们在日常生活中快速做出决策,但同时也可能限制我们...

    房地产大盘开发模式及策略思考-30PPT.pptx

    房地产大盘开发模式及策略思考-30PPT.pptx

    房地产大盘开发模式及策略思考(PPT 30页).pptx

    房地产大盘开发模式及策略思考(PPT 30页).pptx

    大盘时代超级大盘运作模式策略思考.doc

    【大盘时代超级大盘运作模式策略思考】 在当前的房地产市场中,大盘时代已经来临,它具有两大显著特点。一是国土整治色彩的浓厚,这涉及到土地的科学规划、控制、治理和利用,旨在实现最佳资源配置和最大价值。二是...

    用Java模式思考Thinking in Patterns with Java

    - **策略模式**:定义了一系列算法,并将每一个算法封装起来,使它们可以互相替换。 - **观察者模式**:定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 ###...

    传统企业敏捷转型的策略与思考.pdf

    然而,我仍可以就【标题】和【描述】中提及的主题——“传统企业敏捷转型的策略与思考”——提供一些详细的背景信息和知识点。 首先,传统企业在面临快速变化的市场和技术压力时,往往需要采取更加灵活和响应市场...

    EB創新策略模式(傅博士)

    【EB創新策略模式(傅博士)】是一种针对企业电子化(e化)的创新方法论,旨在通过互联网技术和信息技术的应用,重塑企业的核心流程,提升经营绩效。傅新彬教授指出,这种模式着重于产业环境的分析,企业电子化的必要...

    环保行业中期策略:对商业模式的再思考.pdf

    环保行业中期策略:商业模式的再思考 环保行业经历了多变的市场环境,对其商业模式的持续审视和调整是确保企业健康发展的关键。东吴证券分析师袁理在《环保行业中期策略:对商业模式的再思考.pdf》报告中,探讨了...

    房地产大盘开发模式及策略思考PPT学习教案.pptx

    房地产大盘开发模式及策略是房地产行业中一种重要的发展趋势,尤其在城市化进程加速的背景下,大盘项目的兴起对于推动城市功能的综合性和混合性具有显著作用。大盘通常指占地广阔、建筑面积庞大的房地产开发项目,如...

Global site tag (gtag.js) - Google Analytics