好的做法/设计模式解决嵌套if else?

时间:2016-02-26 16:03:42

标签: java design-patterns

目前我有这样的代码:

for (each item) {
   if (item == 'x') { 
      print
   }
   if (item == 'y) {
      print
   } 
}

现在,我还有一个额外的要求 - 我想要相同的检查但不是打印,而是需要在DB中插入。

for (each item) {
   if (item == 'x') { 
      insertDB
   }
   if (item == 'y) {
      insertDB
   } 
}

这有重复的代码,因此标志出现在我的想法中。

for (each item) {
   if (item == 'x') { 
      if (insertDB) {
          insertDB
      } else {
          print
      }
   }
   if (item == 'y) {
      if (insertDB) {
         insertDB
      } else {
         print
      }
   } 
}

这显然造成了很多if-else的混乱。我的面向对象编程告诉我一个新想法。

for (each item) {
   if (item == 'x') { 
      obj.doItemXAction();
   }
   if (item == 'y) {
      obj.doItemXAction();
   } 
}

Object obj = new PrintObj();
Object obj = new DBInsertObj();

代码看起来更干净。但是,考虑到我能想到的,有人能指出我在这种情况下处理的确切设计模式吗?

2 个答案:

答案 0 :(得分:1)

你可以做很多种方法。这实际上取决于您希望如何组织代码。有不止一种好方法。如果我给你模糊的简短回答,“抽象”,“多态性”,“关注点分离”等等。这是一个例子,如果需要/ else则不需要:

interface AnimalBehavior { 
    void eat(); 
    void drink();
}

abstract class Animal implements AnimalBehavior {
    abstract void eat();
    abstract void drink();
}

class Bear extends Animal  {
    void eat() {
            // bear eats cookies
    }        
    void drink() {
            // bear drinks juice
    }        
}

class Chicken extends Animal {
    void eat() {
            // chicken eats candy
    }        
    void drink() {
            // chicken drinks soda
    }
}

class AnimalStats {
    main () {
            Animal chicken1 = new Chicken();
            Animal chicken2 = new Chicken();
            Animal bear1 = new Bear();
            Animal bear2 = new Bear();

            List<Animal> animals = Arrays.asList(chicken1, chicken2, bear1, bear2);

            for(Animal animal: animals) {
                    animal.eat();
                    animal.drink();
            }        
    }
}

答案 1 :(得分:1)

一个更简单的多态性示例:

public interface Actionable {
    void doItemAction();
}

public class Item implements Actionable {
    @Override
    public void doItemAction() {
        // insert or print
    }
}

public static void main(Actionable... args) {
    for (Actionable item : args) {
        item.doItemAction();
    }
}

您可以更进一步,使用ActionableInsertable扩展Printable