2013-08-14 11 views
8

Kiedy chcę się czegoś nauczyć, zadaję sobie pytanie, co utraciłem, gdy się tego nie uczę. Nauczę się wzorców projektowych i wszystko jest w porządku. Ale kiedy dotarłem do Bridge Design Pattern wpadłem w problem. Naprawdę nie mogę sobie wyobrazić, kiedy użyć tego wzoru. I wiem, że istnieją inne linki w google i stackoverflow, takie jak this.Co to jest korzyść z Wzoru Mostowego

Ale czy ktoś może powiedzieć, że straciliśmy, jeśli zapomnimy Bridge Design Pattern i pominiemy ten wzór?

+0

to wygląda dłuższy fabryki wzór IMHO – DevZer0

+0

można zobaczyć [wpisać opis link tutaj] [1] [1]: http://stackoverflow.com/questions/319728/when-do- ty-use-the-bridge-pattern –

+0

@mjavadlatify Widziałem już ten link. Niestety to mi nie pomaga. –

Odpowiedz

10

Wzór Most jest po prostu zwrócić uwagę na kilka zbieżnych obowiązków i ich rozdzielenie. Użyję przykładu The Gang of Four (TGF), ponieważ uważam, że jest naprawdę dobry:

Masz interfejs Window, z dwiema podklasami: XWindow (oparty na X Window Manager) i PMWindow (oparty w programie IBM Presentation Manager (PM) Window Manager ... o którym nigdy nie słyszałem).

tj:

interface Window {} 
class XWindow : Window {} 
class PMWindow : Window {} 

Problem z kontynuacją w naszym tradycyjnym podejściem spadkowego jest, że jeśli specjalizują Okno na aspekcie innego niż jego uzależnienia platformy (czyli masz pewną odpowiedzialność, która jest prostopadła do tej, którą utworzyłem drzewo dziedziczenia do obsługi), musisz użyć wzorca mostu, w przeciwnym razie hierarchia klas będzie rosła geometrycznie w głąb. Myślę, że to dobry sposób myślenia o moście jako połączeniu spadku i kompozycji.

To dość rozwlekłe. Wracając do przykładu TGF: co jeśli chcesz IconWindow i TransientWindow (coś jak szklana tafla). Koncepcja "Icon vs Transient" i "PM vs X" to dwie ortogonalne idee, ale obaj próbują dostać się do tego samego drzewa dziedziczenia. Jeśli nie korzystasz z wzoru most, co musisz zrobić, to stworzyć dwa nowe interfejsy, dziedziczenie z pierwszym i mnóstwo zajęć pod nimi:

interface Window {} 
class XWindow : Window {} 
class PMWindow : Window {} 
interface IconWindow : Window {} 
class XIconWindow : XWindow, IconWindow {} 
class PMIconWindow : PMWindow, IconWindow {} 
interface TransientWindow : Window {} 
class XTransientWIndow : XWindow, TransientWindow {} 
class PMTransientWindow : PMWindow, TransientWindow {} 

wzorkiem mostu byś oddzielenia tych dwóch odpowiedzialność na dwa drzewa dziedziczenia:

interface Window {} 
class IconWindow : Window {} //this class... 
class TransientWindow : Window {} //and this one will keep a private reference to aWindowImp 
interface WindowImp: Window {} 
class XWindowImp : WindowImp {} 
class PMWindowImp : WindowImp {} 

Znacznie czystsza, znacznie lepsza segregacja odpowiedzialności i dużo łatwiejsza do napisania i konsumpcji!

I wierzę, że ten problem z projektowaniem i dziwności nawet drzewa obiektów mostowych były w rzeczywistości niektórymi problemami wpływającymi na konstrukcję miksów w Scali. Używając dziedziczenia wielokrotnego C++, statycznie łączysz wszystkie implementacje z ich systemem okienkowym. Innymi słowy, miałbyś taką samą liczbę typów jak wzór inny niż mostek, ale prawdopodobnie byłyby pustymi klasami i możesz oczywiście odwoływać się do nich przez abstrakcję, co czyni ją dość łatwą do konsumpcji.

+0

To jest dobry przykład, jednak możesz opisać, jaka jest różnica między " Wzorzec Bridge' i 'Strategy'? Wyglądają podobnie! –

+0

Dziękuję, myślę, że twój przykład jest dobry do zrozumienia 'Wzór mostu'. –

2

Zaletami mostu jest oddzielenie abstrakcji i implementacji. Implementacja jest również dynamicznie zmieniana w czasie wykonywania, a rozszerzalność abstrakcji i implementacji jest ulepszona.

Poprzez określenie parametru w generowaniu abstrakcji, implementacja może zostać wybrana również dla implementacji klienta jest całkowicie ukryta. Można uniknąć silnego wzrostu liczby klas.

Wiki UML

+0

możesz podać przykład? –

+0

Sprawdź to http://www.dofactory.com/Patterns/PatternBridge.aspx#_self1 – Kurubaran

+0

Wyobraź sobie, że masz klasę, która uzyskuje dostęp do metody w twojej klasie abstrakcyjnej, którą twoja klasa chce zaimplementować. Wzorzec mostka umożliwia teraz zmianę implementacji w trakcie okresu i dlatego nie jest związany z metodą abstrakcyjnej klasy – JavaDM