`
haobinbin
  • 浏览: 3888 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

借助“策略模式”避免程序中的if...else...语句

阅读更多

       www.infoq.com/cn网站上看了一本书叫《ThoughtWorks文集》,里边有一章讲的是“对象健身操”,其中提到了“拒绝使用else关键字”。那么如何“拒绝使用else关键字”呢?

      

       1、如果程序中只有一个else,如下:

            if(con){

                  dosomething();

            }else{

                  dootherthings();

            }

        可以如下拒绝else:

            if(con){

                  dosomething();

                  return;

            }

            dootherthings();

         或者使用三元运算符:con ? dosometing() : dootherthings();

 

        2、如果程序中有多个else,如下:

            if(con1){

                  dothing1();

            }else if(con2){

                  dothing2();

            }else if(con3){

                  dothing3();

            }......

        可是使用策略模式或多态机制来拒绝else(还有很多其他方式),下面先介绍“策略模式”的方式:

        首先讲一个使用if...else...的例子:

        package ifelse.use;
        public class UseIfElse {
            public static void main(String args[]){
                MyPaper myPaper = new MyPaper(PaperColor.RED);
                if(myPaper.getMyPaperColor() == PaperColor.BLACK){
                    System.out.println("You need a black pen!");
                }else if(myPaper.getMyPaperColor() == PaperColor.BLUE){
                    System.out.println("You need a blue pen!");
                }else if(myPaper.getMyPaperColor() == PaperColor.RED){
                    System.out.println("You need a red pen!");
                }else if(myPaper.getMyPaperColor() == PaperColor.WHITE){
                    System.out.println("You need a white pen!");
                }
           }
       }

       class MyPaper{
           private PaperColor paperColor;
           public MyPaper(PaperColor paperColor){
               this.paperColor = paperColor;
           }
           public PaperColor getMyPaperColor(){
               return this.paperColor;
           }
       }

       enum PaperColor{
           WHITE, BLACK, BLUE, RED
       }

 

       使用if...else...的弊端在于:不利于对程序的扩展,如果新添加了一个颜色类型,那么就得去修改程序再添加一个if...else...分支,根据“开-闭原则”的宗旨:对扩展开,对修改闭。显然是用if...else...已经go out了。

       下面讲一个使用“策略模式”解决上述问题的办法:

       package ifelse.no;
       public class NoIfElse {
           public static void main(String args[]){
               MyPaper myPaper = new MyPaper(new White());
               myPaper.choicePen();
          }
       }

       interface PaperColor{
           public void getPenColor();
       }

       class White implements PaperColor{
           public void getPenColor(){
               System.out.println("You need a white pen!");
           }
       }
       class Red implements PaperColor{
           public void getPenColor(){
               System.out.println("You need a red pen!");
           }
       }
       class Blue implements PaperColor{
           public void getPenColor(){
               System.out.println("You need a blue pen!");
           }
       }
       class Black implements PaperColor{
           public void getPenColor(){
               System.out.println("You need a black pen!");
           }
       }

       class MyPaper{
           private PaperColor paperColor;
           public MyPaper(PaperColor paperColor){
               this.paperColor = paperColor;
           }
           public PaperColor getPaperColor(){
               return this.paperColor;
           }
           public void choicePen(){
               this.paperColor.getPenColor();
           }
      }

 

总结:

     if...else...的每个分支语句都做一件事,因此我们可以把这么些事单独封装在一个类中,就有了White、Blue、Red、Black4个类,这四个类都实现了接口PaperColor,我们再定义一个MyPaper的类(此类具有类似负载均衡的作用,分按照不同的请求分别调用跟前面4个类中的一个)。这样就把if...else...屏蔽掉了。

 

    接下来介绍使用“多态”机制来实现拒绝else:

    package ifelse.no.Polymorphism;

    public class NoIfElse_Polymorphism {
        public static void main(String args[]){
            MyPaper myPaper = new MyPaper();
            myPaper.choice(new Black());
        }
    }

    class White {
        public void getPenColor(){
            System.out.println("You need a white pen!");
        }
    }
    class Red {
        public void getPenColor(){
            System.out.println("You need a red pen!");
        }
    }
    class Blue {
        public void getPenColor(){
            System.out.println("You need a blue pen!");
        }
    }
    class Black {
        public void getPenColor(){
            System.out.println("You need a black pen!");
        }
    }
    class MyPaper{
        public void choice(White white){
            white.getPenColor();
        }
        public void choice(Red red){
            red.getPenColor();
        }
        public void choice(Blue blue){
            blue.getPenColor();
        }
        public void choice(Black black){
            black.getPenColor();
        }
    }

总结:

      此处使用的多态机制指:方法的重构,根据方法名相同儿参数不同的机制,来实现拒绝关键字。

 

注意:上述两种方式适用于同时只有一个分支被执行的情况。

参考:“java设计模式”之“策略模式”。

分享到:
评论

相关推荐

    程序插桩技术PPT学习教案.pptx

    程序插桩方法是借助往被测程序中插入操作,来实现测试目的的方法,即向源程序中添加一些语句,实现对程序语句的执行、变量的变化等情况进行检查。 最简单的插桩是,在程序中插入打印语句printf(“……”)。例如,在...

    C++学习路线-OI Wiki

    if-else 语句 if-elif-else 语句 switch 语句 1.3.2 循环结构¶ 将若干条语句重复执行多次,就需要用到循环语句。 循环 循环语句包括下面几种: for 语句 while 语句 do-while 语句 1.4 数组与结构

    C语言程序设计标准教程

     由C系统提供,用户无须定义, 也不必在程序中作类型说明,只需在程序前包含有该函数原型的头文件即可在程序中直接调用。在前面各章的例题中反复用到printf 、 scanf 、 getchar 、putchar、gets、puts、strcat等...

    C语言中求最大值的方法研究与实现.pdf

    文章总结了五种不同的方法来实现求最大值,包括使用条件运算符、if-else分支语句、函数、宏定义和指针等方法。 一、使用条件运算符实现求两个整数的最大值 条件运算符是C语言中唯一的三目运算符,它的运算符号为...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    由于J2EE的开源的框架中提供了MVC模式实现框架Struts、对象关系模型中的Hibernate 的框架及拥有事务管理和依赖注入的Spring。利用现存框架可以更快开发系统。所以选择Java技术作为blog 的开发工具。 为了增加系统的...

    C++MFC教程

    而32位的系统中每一运行的程序都会有一个消息队列,所以系统可以在多个消息队列中转换而不必等待当前程序完成消息处理就可以得到控制权。这种多任务系统就称为抢先式的多任务系统。Windows95/NT就是这种系统。 1.3 ...

    突破程序员基本功的16课.part2

    4.4.5 避免在经常调用的方法、循环中创建Java对象 4.4.6 缓存经常使用的对象 4.4.7 尽量不要使用finalize方法 4.4.8 考虑使用SoftReference 4.5 小结 第5课 表达式中的陷阱 5.1 关于字符串的陷阱 5.1.1 JVM...

    ff4j:Java功能标志变得简单

    在您的代码中,实现由动态谓词(if / then / else)保护的多个路径。 基于角色的切换:不仅启用具有标志值的功能,而且还启用具有角色和组的访问权限(Canary Release)。 Spring Security开始支持不同的框架。 ...

    excel的使用

    rr) If rr = "上班" Then rrr = 0.6 * tatol ElseIf rr = "加班" Then rrr = 0.5 * tatol ElseIf rr = "休息日" Then rrr = 0.9 * tatol End If End Function (如图9)。图9这时关闭编辑器,只要我们在相应的列中...

    基于SIP开发软件电话的一些资源(转自YOUTOO)

    我们先进行一个简单的纯SIP信令(不带语音连接建立)的UAC的SIP终端的程序开发的试验(即一个只能作为主叫不能作为被叫的的SIP软电话模型),我们创建一个MFC应用程序,对话框模式,照上面的说明,...

Global site tag (gtag.js) - Google Analytics