過多if-else分支的優化

壹頁書發表於2015-01-21
JAVA程式經常看到一個函式中包含了十幾個if-else的分支判斷
比如 根據不同職位增加工資的例子

  1. public class Employee {
  2.     private int salary = 10;

  3.     public void addMoney(String str) {
  4.         if ("初級JAVA程式設計師".equals(str)) {
  5.             this.salary = salary + 30;
  6.         } else if ("中級JAVA程式設計師".equals(str)) {
  7.             this.salary = salary + 50;
  8.         } else if ("高階JAVA程式設計師".equals(str)) {
  9.             this.salary = salary + 80;
  10.         } else if ("架構師".equals(str)) {
  11.             this.salary = salary + 100;
  12.         } else if ("資料庫管理員".equals(str)) {
  13.             this.salary = salary + 100;
  14.         } else if ("專案經理".equals(str)) {
  15.             this.salary = salary + 100;
  16.         } else if ("菜鳥".equals(str)) {
  17.             this.salary = salary + 10;
  18.         }
  19.         // ...
  20.         System.out.println(this.salary);
  21.     }

  22.     public static void main(String[] args) {
  23.         Employee e = new Employee();
  24.         e.addMoney("菜鳥");
  25.     }
  26. }
可以改寫如下

  1. import java.util.HashMap;
  2. import java.util.Map;

  3. public class Employee {
  4.     private int salary = 10;

  5.     private interface IStrategy {
  6.         int addMoney();
  7.     };

  8.     Map<String, IStrategy> strategy = new HashMap<String, IStrategy>();

  9.     {
  10.         strategy.put("初級JAVA程式設計師", new IStrategy() {
  11.             @Override
  12.             public int addMoney() {
  13.                 return 30;
  14.             }
  15.         });

  16.         strategy.put("中級JAVA程式設計師", new IStrategy() {
  17.             @Override
  18.             public int addMoney() {
  19.                 return 50;
  20.             }
  21.         });

  22.         strategy.put("高階JAVA程式設計師", new IStrategy() {
  23.             @Override
  24.             public int addMoney() {
  25.                 return 80;
  26.             }
  27.         });

  28.         strategy.put("架構師", new IStrategy() {
  29.             @Override
  30.             public int addMoney() {
  31.                 return 100;
  32.             }
  33.         });

  34.         strategy.put("資料庫管理員", new IStrategy() {
  35.             @Override
  36.             public int addMoney() {
  37.                 return 100;
  38.             }
  39.         });

  40.         strategy.put("專案經理", new IStrategy() {
  41.             @Override
  42.             public int addMoney() {
  43.                 return 100;
  44.             }
  45.         });

  46.         strategy.put("菜鳥", new IStrategy() {
  47.             @Override
  48.             public int addMoney() {
  49.                 return 10;
  50.             }
  51.         });

  52.     }

  53.     public void addMoney(String str) {
  54.         this.salary = salary + strategy.get(str).addMoney();
  55.         System.out.println(this.salary);
  56.     }

  57.     public static void main(String[] args) {
  58.         Employee e = new Employee();
  59.         e.addMoney("菜鳥");
  60.     }
  61. }
如果是複雜的專案,可以把匿名內部類改為普通類.

改寫之後,無論新增或者刪除邏輯,都非常的簡單明瞭,並且邏輯的變更,限制在了一個較小的範圍.
實現了高內聚,低耦合的設計思路.

參考:
http://raychase.iteye.com/blog/1814187

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1409748/,如需轉載,請註明出處,否則將追究法律責任。

相關文章