2013-05-28 12 views
6

Kontroler otrzymuje listę kilku owoców od użytkownika. Kontroler musi wykonać sok z każdego z tych owoców. Jeden sokowirówka może wytwarzać sok z pomarańczy i grejpfruta; inny sokowiec wie, jak zrobić sok z jabłka, banana i papai; i tak dalej. Każdy sokowirówka może przyjmować wiele owoców za jednym zamachem, przetwarza tylko owoce, które są w stanie i ignoruje inne owoce nietknięte. Uprzejmie prosimy o zaproponowanie odpowiedniego projektu tego problemu. Rozważam następujące opcje:Dylemat wyboru szablonu projektu

  1. Połączenia kontrolerów MasterJuicer.juice(List<Fruit> fruits). MasterJuicer z kolei wywołuje CitrusJuicer.juice(fruits) i PulpyJuicer.juice(fruits).
  2. Łańcuch odpowiedzialności nie wydaje się właściwy. Kolejność, w której przywoływane są sokowirówki, nie ma znaczenia.
  3. Fabryka? Sterownik wywołuje JuicerFactory.getJuicers(List<Fruit> fruits), aby uzyskać List<Juicer>. Kontroler następnie pętli przez każdy sokowirówka i wywołuje Juicer.juice(fruits). Czy często zdarza się, że fabryka zwraca listę wystąpień?
  4. Prowadzenie rejestru owoców i sokowirów w Map? Sterownik wywołuje FruitsRegistry.getJuicer(Fruit fruit) dla każdego owocu, a następnie wywołuje każdy sokowirówkę w pętli.

Odpowiedz

2

Fabryka może dostarczyć odpowiednie sokowirówki, ale wtedy logika obsługi sokowirówki jest przekazywana do kontrolera.

Modele combination ze wzorów composite i visitor mogą być dla Ciebie przydatne.

  1. Kompozyt wzór pozwoli skonstruować MasterJuicer że wie o innych sokowirówki i może zainicjować proces „wyciskania” poprzez delegowanie do sokowirówki. Rozwiązuje to "strukturalny" aspekt twojego problemu.
  2. Wzorzec odwiedzający umożliwia każdej sokowirówce jednolitą metodę interakcji z nimi bez dzwoniącego (kompozytowy MasterJuicer) dbając o to, jak pracują razem. Obsługuje aspekt "behawioralny".

Możesz przesłać listę składników do przetworzenia między każdym gościem, aby mogli wchodzić w interakcje z owocami, którymi się zajmują.

Jeśli nie chcesz ręcznie rejestrować sokowirów za pomocą MasterJuicera, możesz być sprytny dzięki wykrywaniu usług.Powszechną techniką w Javie jest używanie adnotacji i skanowanie klasy w celu znalezienia klas w czasie wykonywania i rejestrowania ich automatycznie podczas uruchamiania. Dostępnych jest a few libraries, a jeśli już używasz Spring Framework, możesz użyć jego built-in scanning tools.

+0

Bardzo atrakcyjna odpowiedź. Zamierzam przezwyciężyć te pomysły przez jakiś czas i zobaczyć, w jaki sposób przyniosą one korzyści dla mojego prawdziwego scenariusza biznesowego. I dzięki za linki do narzędzi skanowania classpath! – Somu

2

myślę trzecia opcja jest najbardziej odpowiednia, choć fabrykapowinien być odpowiedzialny za zwrot odpowiedniej sokowirówkę do zadania - tak nie powinno przywrócić wszystkie sokowirówki ale ten co potrzeba do tego zadania. Mapę można włączyć do niej, aby pomóc we właściwym wyborze.

tym przypadku fabryka zawiera logikę o wyborze sokowirówka, a nie kontrolera.

+0

Jak stwierdzono w pytaniu, "zadanie" może wymagać więcej niż jednego Sokowirówki w zależności od Listy Owoców. W mojej opcji nr 3 nie miałem na myśli, że Factory zwróci wszystkich sokowirów. Zamiast tego Factory zeskanuje owoce i zwróci tylko te sokowirówki, które są niezbędne do ich przetworzenia. – Somu

+0

Ah, prawda, przepraszam. Następnie napisałeś poprawną "implementację". – ragatskynet

0

Proponuję Decorator Pattern

Główną ideą jest to, że masz sokowirówki bazowej i dodać inne funkcje.

Mam nadzieję, że pomoże!

+0

Nie ma urządzenia BaseJuicer (z domyślną lub wspólną funkcją), które można udekorować. Uprzejmie rozwiń swoją odpowiedź za pomocą kodu, aby lepiej zrozumieć. – Somu

1

Jest to zdecydowanie łańcuch odpowiedzialności. Jakoś iterować nad Juicers i tworzyć sok, dopóki nie stracisz owoców. Niektóre rzeczy do rozważenia to konieczność wymieszania powstałych soków (prawdopodobnie złożony wzór na Juice) i jak ustawić pierwszeństwo (jeśli dwa sokowirówki będą sokiem z grejpfruta, który powinien to zrobić?). Hermetyzuj całą tę logikę za interfejsem Juicer.

Powiązane problemy