2010-04-29 2 views
2

В устаревшей кодовой базе у меня очень большой класс с слишком большим количеством полей/обязанностей. Представьте, что это объект Pizza.Pseudo-Backward Builder Pattern?

Он имеет весьма гранулированных поля, как:

  • hasPepperoni
  • hasSausage
  • hasBellPeppers

Я знаю, что, когда эти три поля являются истинными, мы имеем Supreme пиццу. Тем не менее, этот класс не открыт для расширения или изменения, поэтому я не могу добавить PizzaType или isSupreme() и т. Д. Люди на всей кодовой базе дублируют одну и ту же логику if(a && b && c) then isSupreme) по всему месту. Эта проблема возникает из нескольких понятий, поэтому я ищу способ деконструировать этот объект во многих подобъектах, например. псевдо-обратный шаблон строителя.

PizzaType pizzaType = PizzaUnbuilder.buildPizzaType(Pizza); //PizzaType.SUPREME 

Dough dough = PizzaUnbuilder.buildDough(Pizza); 

Это правильный подход? Этот шаблон уже существует?

+0

Вы когда-нибудь получали удовлетворительный ответ, Avid? – Pureferret

ответ

3

Как насчет шаблона адаптера?

В основном класс обертки, который обладает всеми функциональными возможностями, которые вы действительно хотите, которые могут легко перемещаться вперед и назад в класс Pizza.

MenuPizza myPizza = new MenuPizza(pizza); 
PizzaType pizzaType = myPizza.getPizzaType(); 
DoughType doughType = myPizza.getDoughType(); 

И вы могли бы обеспечить обратную функциональность ...

MenuPizza otherPizza = new MenuPizza(PizzaType.SUPREME, DoughType.SOUR); 
Pizza pizzaPOJO = otherPizza.getPizzaPOJO(); 
+0

У меня также есть аналогичный вопрос, связанный с моделью принципа единственной ответственности [здесь] (http://stackoverflow.com/questions/29742523/how-to-follow-single-responsibility-principle-in-my-httpclient-executor). Если возможно, вы можете помочь мне там. Любая помощь будет оценена. – john

0

Я думаю, что это было бы большим примером использования функций расширения, которые не существуют в Java. Вместо этого самым простым решением в моем сознании является создание класса и добавление методов, которые будут расширениями в этот класс утилиты, как статические методы; PizzaUtils.isSupreme(Pizza pizza).