2016-02-26 2 views
-1

В настоящее время у меня есть следующий код:Хорошая практика/шаблон дизайна для решения вложенных, если еще?

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

Теперь я есть дополнительное требование - Я хочу, чтобы одни и те же проверки, но вместо печати, мне нужно вставить в БД.

т.е.

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(); 

Код выглядит намного чище. Но, учитывая то, что я мог придумать, может ли кто-нибудь указать мне на точный шаблон дизайна, который касается ситуаций, подобных этому?

+1

Выглядит немного как «шаблон стратегии» или, по крайней мере, кандидат на него. Http://www.tutorialspoint.com/design_pattern/strategy_pattern.htm –

ответ

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(); 
    } 
} 

Вы можете взять его на шаг дальше и расширить Actionable с Insertable и Printable.

1

Существует так много способов, которыми вы можете заниматься. Это действительно зависит от того, как вы хотите организовать свой код. Есть более чем один хороший способ. Если я дам вам смутные короткие ответы, «Абстракция», «полиморфизм», «разделение интересов» и т.д. Вот один пример, нет, если требуется/другое:

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(); 
      }   
    } 
} 
Смежные вопросы