zoukankan      html  css  js  c++  java
  • if else替代者

    实战中,哪些设计模式可以替代if else呢?其实GoF设计模式都可以用来替代if else,我们分别描述如下:

    • 状态模式 
        当数据对象存在各种可能性的状态,而且这种状态将会影响到不同业务结果时,那么我们就应该考虑是否使用状态模式,当然,使用状态模式之前,你必须首先 有内存状态这个概念,而不是数据库概念,因为在传统的面向过程的/面向数据库的系统中,你很难发现状态的,从数据库中读取某个值,然后根据这个值进行代码 运行分流,这是很多初学者常干的事情。参考文章:状态对象:数据库的替代者
        使用传统语言思维的情况还有:使用一个类整数变量标识状态:

      public class Order{

      private int status;

      //说明:

      //status=1 表示订货但为查看 ;

      //status=2 表示已经查看未处理;

      //status=3 表示已经处理未付款

      //status=4 表示已经付款未发货

      //status=5 表示已经发货

      }


        上述类设计,无疑是将类作为传统语言的函数来使用,这样导致程序代码中存在大量的if else。

    • 策略模式 
        当你面临几种算法或者公式选择时,可以考虑策略模式,传统过程语言情况是:从数据库中读取算法数值,数值1表示策略1,例如保存到数据库;数值为2表 示策略2,例如保存到XMl文件中。这里使用if else作为策略选择的开关。

    • command模式 
        传统过程的思维情况是:如果客户端发出代号是1或"A",那么我调用A.java这个对象来处理;如果代号是2或"B",我就调用B.java来处 理,通过if else来判断客户端发送过来的代码,然后按事先约定的对应表,调用相应的类来处理。

    • MVC模式 
        MVC模式的传统语言误用和Command模式类似,在一个Action类中,使用if else进行前后台调度,如果客户端传送什么命令;我就调用后台什么结果;如果后台处理什么结构,再决定推什么页面,不过,现在我们使用 Struts/JSF这样MVC模式的框架实现者就不必范这种低级错误。

    • 职责链模式 
        职责链模式和Command模式是可选的,如果你实在不知道客户端会发出什么代号;也没有一个事先定义好的对照表,那么你只能编写一个个类去碰运气一样打开这个包看一下就可以。与Command是不同在AOP vs Decorator一文中有分析。

    • 代理或动态代理模式 
        代理对象可以是符合某种条件的代表者,比如,权限检验,传统面向过程思维是:当一个用户登陆后,访问某资源时,使用if else进行判断,只有某种条件符合时,才能允许访问,这样权限判断和业务数据逻辑混乱在一起,使用代理模式可以清晰分离,如果嫌不太好,使用动态代理, 或者下面AOP等方式。

    • AOP或Decorator模式
        
        其实使用filter过滤器也可以替代我们业务中的if else,过滤器起到一种过滤和筛选作用,将符合本过滤器条件的对象拦截下来做某件事情,这就是一个过滤器的功能,多个过滤器组合在一起实际就是if else的组合。
        所以,如果你实在想不出什么办法,可以使用过滤器,将过滤器看成防火墙就比较好理解,当客户端有一个请求时,经过不同性质的防火墙,这个防火墙是拦截 端口的;那个防火墙是安全检查拦截等等。过滤器也如同红蓝白各种光滤镜;红色滤镜只能将通过光线中的红色拦截了;蓝色滤镜将光线中的蓝色拦截下来,这实际 上是对光线使用if else进行分解。


        如图,通过一个个条件过滤器我们立体地实现了对信号的分离,如果你使用if else,说明你是将图中的条件1/2/3/4合并在一起,在同一个地方实现条件判断。
        需要深入了解过滤器的实现细节和微小区别,请参考文章:AOP vs Decorator

    OO设计的总结  

      还有一种伪模式,虽然使用了状态等模式,但是在模式内部实质还是使用if else或switch进行状态切换或重要条件判断,那么无疑说明还需要进一步努力。更重要的是,不能以模式自居,而且出书示人。

      真正掌握面向对象这些思想是一件困难的事情,目前有各种属于揪着自己头发向上拔的解说,都是误人 子弟的,所以我觉得初学者读Thinking in Java(Java编程思想)是没有用,它试图从语言层次来讲OO编程思想,非常失败,作为语言参考书可以,但是作为Java体现的OO思想的学习资料, 就错了。

      OO编程思想是一种方法论,方法论如果没有应用比较,是无法体会这个方法论的特点的,禅是古代一个方法论,悟禅是靠挑水砍柴这些应用才能体会。

      那么OO思想靠什么应用能够体会到了?是GoF设计模式,GoF设计模式是等于软件人员的挑水砍 柴等基本活,所以,如果一个程序员连基本活都不会,他何以自居OO程序员?从事OO专业设计编程这个工作,如果不掌握设计模式基本功,就象一个做和尚的人 不愿意挑水砍柴,他何以立足这个行业?早就被师傅赶下山。

      最后总结:将if else用在小地方还可以,如简单的数值判断;但是如果按照你的传统习惯思维,在实现业务功能时也使用if else,那么说明你的思维可能需要重塑,你的编程经验越丰富,传统过程思维模式就容易根深蒂固,想靠自己改变很困难;建议接受专业头脑风暴培训

      用一句话总结:如果你做了不少系统,很久没有使用if else了,那么说明你可能真正进入OO设计的境地了。(这是本人自己发明的实战性的衡量考核标准)。

    http://www.jdon.com/artichect/ifelse.htm

  • 相关阅读:
    还记得吗
    PAT A 1065. A+B and C (64bit) (20)
    畅通project(杭电1863)
    cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第七步---英雄要升级&属性--解析csv配置文件
    热烈祝贺Polymer中文组织站点上线
    具体解释HTML中的window对象和document对象
    oc15--文档安装
    oc14--匿名对象
    oc13--pragma mark
    oc12--对象作为参数
  • 原文地址:https://www.cnblogs.com/rash/p/2915264.html
Copyright © 2011-2022 走看看