Fasada a mediator


83

Badałem różnicę między tymi dwoma wzorcami.

Rozumiem, że fasada obejmuje dostęp do podsystemu, a mediator hermetyzuje interakcje między komponentami.

Rozumiem, że komponenty podsystemu nie są świadome fasady, gdzie komponenty są oczywiście świadome mediatora.

Obecnie używam fasady do hermetyzacji metody pobierania informacji konfiguracyjnych, np. App.Config, ustawień użytkownika przechowywanych w SQL, Informacje o zestawie itp. Oraz mediatora do nawigacji między różnymi formularzami okien.

Jednak większość witryn zwraca uwagę, że mediator „dodaje funkcje”. Co przez to rozumieją? W jaki sposób mediator dodaje funkcje?

Odpowiedzi:


103

... większość witryn wskazuje, że mediator „dodaje funkcje” ...

Fasady odsłania jedynie istniejącą funkcjonalność z innej perspektywy.

mediator „dodaje” funkcjonalność, ponieważ łączy w sobie różne istniejące funkcje, aby utworzyć nową.

Weźmy następujący przykład:

Masz system logowania. Z tego systemu rejestrowania można zalogować się do pliku, do gniazda lub do bazy danych.

Używając wzorca projektowego elewacji, można „ukryć” wszystkie powiązania przed istniejącą funkcjonalnością za jednym „interfejsem” tym, który eksponuje fasada.

Kod klienta:

 Logger logger = new Logger();
 logger.initLogger("someLogger");
 logger.debug("message");

Implementacja może obejmować interakcję wielu obiektów. Ale ostatecznie funkcjonalność już istnieje. Prawdopodobnie metoda „debugowania” jest zaimplementowana w następujący sposób:

Realizacja:

 class Logger { 

      private LoggerImpl internalLogger;
      private LoggerManager manager;

      public void initLogger( String loggerName ) {
          this.internalLogger = manager.getLogger( loggerName ); 
      }

      public void debug( String message ) { 
          this.internalLogger.debug( message );
      }     
 }

Funkcjonalność już istnieje. Fasada tylko go ukrywa. W tym hipotetycznym przypadku LoggerManager obsługuje tworzenie poprawnego programu rejestrującego, a LoggerImpl jest prywatnym obiektem pakietu, który ma metodę „debugowania”. W ten sposób Fasada nie dodaje funkcjonalności, a jedynie deleguje ją do niektórych istniejących obiektów.

Z drugiej strony mediator dodaje nową funkcjonalność, łącząc różne obiekty.

Ten sam kod klienta:

 Logger logger = new Logger();
 logger.initLogger("someLogger");
 logger.debug("message");

Realizacja:

 class Logger { 

      private java.io.PrintStream out;
      private java.net.Socket client;
      private java.sql.Connection dbConnection;
      private String loggerName;


      public void initLogger( String loggerName ) {
               this.loggerName = loggerName;
               if ( loggerName == "someLogger" ) { 
                    out = new PrintStream( new File("app.log"));
               } else if ( loggerName == "serverLog" ) { 
                    client = new Socket("127.0.0.1", 1234 );
               } else if( loggerName == "dblog") { 
                    dbConnection = Class.forName()... .
               }

      }

      public void debug( String message ) { 

               if ( loggerName == "someLogger" ) { 
                    out.println( message );
               } else if ( loggerName == "serverLog" ) { 
                    ObjectOutputStrewam oos = 
                           new ObjectOutputStrewam( client.getOutputStream());
                    oos.writeObject( message );
               } else if( loggerName == "dblog") { 
                    Pstmt pstmt = dbConnection.prepareStatment( LOG_SQL );
                    pstmt.setParameter(1, message );
                    pstmt.executeUpdate();
                    dbConnection.commit();
               }
      }
 }

W tym kodzie mediator jest tym, który zawiera logikę biznesową do utworzenia odpowiedniego „kanału” do logowania, a także do logowania się do tego kanału. Mediator „tworzy” funkcjonalność.

Oczywiście są lepsze sposoby na wdrożenie tego przy użyciu polimorfizmu, ale chodzi o to, aby pokazać, w jaki sposób mediator „dodaje” nową funkcjonalność, łącząc istniejącą funkcjonalność (w moim przykładzie nie było bardzo przykro), ale wyobraź sobie mediatora, przeczytaj z bazy danych hosta zdalnego, z którego należy się logować, a następnie tworzy klienta i na koniec zapisuje w strumieniu wydruku tego klienta komunikat dziennika. W ten sposób pośrednik „pośredniczy” między różnymi przedmiotami.

Wreszcie fasada jest wzorem strukturalnym, czyli opisuje kompozycję obiektów, podczas gdy mediator jest behawiorystą, to znaczy opisuje sposób interakcji obiektów.

Mam nadzieję, że to pomoże.


Świetne wyjaśnienie… Mam pytanie związane z tym. Czy sposób, w jaki składają się elementy ReentrantLock i AbstractQueueSynchronizer (AQS), pasuje do przykładu wzorca fasady? Mam na myśli, że ReentrantLock ujawnia tylko funkcjonalność AQS, która jest obecna w nim jako podsystem.
AKS

Czy odpowiedź @RayTayek jest sprzeczna z twoją odpowiedzią? Protokół twojego mediatora jest jednokierunkowy, prawda?
Narek

Nie mogłem znaleźć żadnej witryny (w tym Wikipedii) stwierdzającej, że Mediator dodaje nową funkcjonalność. Czy możesz wskazać jakieś odniesienia?
deweloper

@developer tutaj jest odniesieniem , spójrz na dół.
Dario Fumagalli

13

Używam mediatora, aby dodać funkcjonalność pliku dziennika.

Działa to tak:

  • Obiekt A mówi mediatorowi, że musi coś zrobić.
  • Mediator wysyła wiadomość do różnych obiektów klienta.
  • Obj B robi to, czego potrzebuje Obj A i wysyła odpowiednią wiadomość z powrotem za pośrednictwem mediatora.
  • W międzyczasie obiekt C jest również wysyłany przez mediatora do obu komunikatów i rejestruje wyniki. W ten sposób możemy uzyskać statystyki użytkowników z plików dziennika.
  • Obj D może również sprawdzać błędy, więc jeśli Obj B odpowie, że żądanie Obj A jest niemożliwe, Obj D może być tym, co zgłasza to użytkownikowi. Błędy mogą być teraz rejestrowane w innym pliku niż zwykła aktywność i mogą używać innych środków do zachowania (pikanie, cokolwiek), którymi Obj A nie powinien się zajmować.

12

pod pokrewnymi wzorcami, gof mówi: Fasada (185) różni się od Mediatora tym, że wyodrębnia podsystem obiektów, aby zapewnić wygodniejszy interfejs. Jego protokół jest jednokierunkowy; to znaczy, że obiekty Fasady żądają klas podsystemów, ale nie odwrotnie. W przeciwieństwie do tego Mediator umożliwia zachowanie kooperacyjne, którego nie zapewniają lub nie mogą obiekty współpracowników, a protokół jest wielokierunkowy.


8

Weź prostą analogię:

Fasada: jak parking, na wezwanie

parkingLot.Out(car1);

mab be a simple chain działa:

{
  car1.StartEngin();      
  attendant.charge();
  car1.driverOut();
}

Mediator: jak sygnalizacja świetlna.

Istnieją interakcje między światłem a samochodem,

a samochody są kontrolowane przez jego stan.

Pomyślałem, że może to jest mediator „dodaje funkcjonalność”


A o definicji:

Typ elewacji: strukturalna

Typ mediatora: behawioralny

fasada bardziej zainteresowana komponentami została zawarta w ujednoliconym interfejsie ,

oraz mediator problemem jaki zestaw obiektów interakcji .


4

Myślałem, że to rozróżnienie jest kierunkowe: fasada to jednostronna komunikacja między klientem a fasadą; Mediator może być dwustronną rozmową, z wiadomościami przepływającymi tam i z powrotem między klientem a mediatorem.


Przepraszam, ale ta różnica jest w rzeczywistości błędna, odpowiedź mmr jest poprawna. Chociaż też wierzyłem w to samo, co ty, kiedy po raz pierwszy na nie spojrzałem
Robert Gould

3

W książce „Wzorce projektowe” KLUCZ wzorca Mediatora jest opisany w następujący sposób: „To (mediator) działa jako HUB komunikacji dla widżetów (tj.„ Grupa ”współzależnych obiektów)”.

Innymi słowy, obiekt mediatora jest jedynym nadobiektem, który zna wszystkie inne obiekty w grupie współpracujących obiektów i zna ich wzajemne oddziaływanie. Wszystkie inne obiekty powinny oddziaływać z obiektem mediatora, a nie ze sobą nawzajem.

W przeciwieństwie do tego fasada jest „ujednoliconym interfejsem” dla zestawu interfejsów w podsystemie - do użytku przez konsumentów podsystemu - a nie wśród komponentów podsystemu.


1

Szczegóły dotyczące wzoru elewacji można znaleźć w tym pytaniu SE:

Co to jest wzorzec projektowania elewacji?

Facade zapewnia prosty i ujednolicony interfejs do złożonego systemu.

Przykład z prawdziwego świata ( lot cleartrip + rezerwacja hotelu ) jest dostępny w tym poście:

Co to jest wzorzec projektowania elewacji?

MediatorWzorzec : Zdefiniuj obiekt, który zawiera sposób interakcji zestawu obiektów. Mediator promuje luźne powiązania, uniemożliwiając obiektom bezpośrednie odwoływanie się do siebie, i pozwala niezależnie zmieniać ich interakcje.

Prawdziwy przykład topologii sieci Mesh przedstawiono w poniższym pytaniu SE:

Wzorce projektowe zorientowane obiektowo Mediator Vs Observer

Jeśli chodzi o Twoje zapytanie dotyczące Mediatora, dodajesz odpowiedzialność:

  1. Fasada zapewnia jedynie interfejs dla istniejących podsystemów . Istniejące podsystemy nie są świadome samej klasy fasady.

  2. Mediator wie o przedmiotach współpracowników . Umożliwia komunikację między różnymi współpracownikami. W przykładzie, który przytoczyłem w powiązanym pytaniu, ConcreteMediator ( NetworkMediator ) wysyła powiadomienia o zarejestrowaniu i wyrejestrowaniu jednego współpracownika do wszystkich pozostałych współpracowników.


1

Obie narzucają jakąś politykę na inną grupę obiektów. Fasada narzuca polisę od góry, a Mediator od dołu. Sposób użycia Fasady jest widoczne i krępujące, podczas gdy użycie Mediatora jest niewidoczne i umożliwia.

Fasada wzór jest używany, gdy chcemy, aby zapewnić prosty i konkretny interfejs do grupy obiektów, które ma złożoną i ogólny interfejs.

Mediator wzorzec nakłada również politykę. Jednak mając na uwadze, że Facade narzucił swoją politykę w widoczny i ograniczający sposób, Mediator narzuca swoją politykę w sposób ukryty i nieograniczony.

Zwinne tworzenie oprogramowania, zasady, wzorce i praktyki Robert C. Martin.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.