天天看點

用設計模式來代替臃腫的ifelse層層判斷

--------------------------------<代碼優化之避免使用過多ifelse>---------------------------------

在www.infoq.com/cn網站上看了一本書叫《thoughtworks文集》,裡邊有一章講的是“對象健身操”,其中提到了“拒絕使用else關鍵字”。那麼如何“拒絕使用else關鍵字”呢?

       1、如果程式中隻有一個else,如下:

            if(con){

                  dosomething();

            }else{

                  dootherthings();

            }

        可以如下拒絕else:

                  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{

               system.out.println("you need a red pen!");

       class blue implements papercolor{

               system.out.println("you need a blue pen!");

       class black implements papercolor{

               system.out.println("you need a black pen!");

           public papercolor getpapercolor(){

           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 {

            system.out.println("you need a red pen!");

    class blue {

            system.out.println("you need a blue pen!");

    class black {

            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設計模式”之“政策模式”。

=================================<代碼優化之避免使用過多ifelse>======================================