Фасад против Посредника - PullRequest
74 голосов
/ 27 января 2009

Я исследовал разницу между этими двумя паттернами.

Я понимаю, что фасад инкапсулирует доступ к подсистеме, а посредник - взаимодействия между компонентами.

Я понимаю, что компоненты подсистемы не знают о фасаде, тогда как компоненты, очевидно, знают о посреднике.

В настоящее время я использую фасад для инкапсуляции метода получения информации о конфигурации, например, App.Config, пользовательские настройки, хранящиеся в SQL, информация о сборке и т. Д., А также посредник для навигации между различными формами окон.

Однако большинство сайтов указывают, что посредник «добавляет функциональность». Что они подразумевают под этим? Как посредник добавляет функциональность?

Ответы [ 8 ]

91 голосов
/ 27 января 2009

... большинство сайтов отмечают, что посредник «добавляет функциональность» ...

Фасад раскрывает существующие функциональные возможности только с другой точки зрения.

Медиатор "добавляет" функциональность, поскольку он объединяет различные существующие функции для создания новой.

Возьмите следующий пример:

У вас есть система регистрации. Из этой системы ведения журналов вы можете войти либо в файл, либо в сокет, либо в базу данных.

Используя шаблон проектирования фасада, вы бы «скрывали» все взаимосвязи от существующей функциональности за одним «интерфейсом», который предоставляет фасад.

Код клиента:

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

Реализация может включать взаимодействие многих объектов. Но в конце концов, функциональность уже существует. Вероятно, метод «отладки» реализован следующим образом:

Реализация:

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

Функциональность уже существует. Фасад только скрывает это. В этом гипотетическом случае LoggerManager обрабатывает создание правильного регистратора, а LoggerImpl является частным объектом пакета, который имеет метод «debug». Таким образом, Фасад не добавляет функциональности, он просто делегирует некоторые существующие объекты.

С другой стороны, посредник добавляет новые функциональные возможности, комбинируя различные объекты.

Тот же код клиента:

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

Реализация:

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

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

Конечно, есть лучшие способы реализовать это с помощью полиморфизма, но смысл здесь в том, чтобы показать, как посредник «добавляет» новые функциональные возможности, комбинируя существующие функциональные возможности (в моем примере это не очень жаль), но представьте, что Посредник, прочитайте из базы данных удаленный хост, на который нужно войти, затем создайте клиента и, наконец, запишите этому клиенту поток печати сообщения журнала. Таким образом, посредник будет «посредничать» между различными объектами.

Наконец, фасад является структурным паттерном, то есть описывает структуру объектов, в то время как медиатор является поведенческим, то есть описывает, как объекты взаимодействуют между собой.

Надеюсь, это поможет.

12 голосов
/ 27 января 2009

Я использую медиатор для добавления функциональности файла журнала.

Работает так:

  • Obj A говорит посреднику, что ему нужно что-то сделать.
  • Посредник отправляет сообщение различным объектам клиента.
  • Obj B делает то, что нужно Obj A, и отправляет соответствующее сообщение обратно через посредника.
  • Между тем, Obj C также отправляет оба сообщения посредником и регистрирует результаты. Таким образом, мы можем получить пользовательскую статистику из файлов журнала.
  • Obj D также может быть средством проверки ошибок, поэтому, если Obj B ответит, что запрос Obj A невозможен, Obj D может быть тем, что сообщает об этом пользователю. Теперь ошибки могут регистрироваться в файле, отличном от обычного действия, и могут использовать некоторые другие средства для поведения (звуковой сигнал, что угодно), к которому Obj A не должен относиться.
10 голосов
/ 13 июня 2015

в связанных шаблонах gof говорит: Facade (185) отличается от Mediator тем, что он абстрагирует подсистему объектов для обеспечения более удобного интерфейса. Его протокол является однонаправленным; то есть объекты Facade делают запросы классов подсистемы, но не наоборот. Mediator, напротив, обеспечивает совместное поведение, которое объекты коллеги не могут или не могут предоставить, и протокол является многонаправленным.

6 голосов
/ 31 мая 2013

Возьмем простую аналогию:

Фасад: как стоянка, при звонке

parkingLot.Out(car1);

может быть простой цепочкой работ:

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

Посредник: как светофор.

Есть взаимодействие света и автомобиля,

и машины контролируются его состоянием.

Хотя, возможно, это посредник , «добавляющий функциональность»


А по поводу определения:

Тип фасада: Структурный

Тип медиатора: Поведенческий

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

и посредник как набор объектов взаимодействует .

4 голосов
/ 27 января 2009

Я думал, что различие было направленным: фасад - это односторонняя связь между клиентом и фасадом; Посредником может быть двусторонний разговор, в котором сообщения передаются между клиентом и посредником.

3 голосов
/ 12 января 2011

Из книги «Шаблоны проектирования» КЛЮЧ шаблона Посредника описывается следующим образом: «Он (посредник) действует как концентратор связи для виджетов (т. Е.« Группа »взаимозависимых объектов)».

Другими словами, объект-посредник - это единственный суперобъект, который знает все другие объекты в группе взаимодействующих объектов и то, как они должны взаимодействовать друг с другом. Все остальные объекты должны взаимодействовать с объектом-посредником, а не друг с другом.

Напротив, фасад - это «унифицированный интерфейс» для набора интерфейсов в подсистеме - для использования потребителями подсистемы - не среди компонентов подсистемы.

1 голос
/ 16 мая 2018

Оба навязывают какую-то политику другой группе объектов. Фасад накладывает политику сверху, а Посредник накладывает политику снизу. Использование Фасад является видимым и ограничивающим, в то время как использование Медиатор невидимо и позволяет.

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

Шаблон Mediator также накладывает политику. Однако, в то время как Фасад навязал свою политику видимым и сдерживающим образом, Посредник навязывает свою политику скрытно и без ограничений.

Гибкая разработка программного обеспечения, принципы, шаблоны и практики Роберт К. Мартин.

1 голос
/ 08 августа 2016

Подробную информацию о фасаде можно найти в этом вопросе по SE:

Что такое шаблон оформления фасада?

Facade предоставляет простой и унифицированный интерфейс для сложной системы.

Пример реального мира ( перелет Cleartrip + бронирование отеля ) доступен в этом сообщении:

Что такое шаблон оформления фасада?

Посредник pattern: Определите объект, который инкапсулирует, как взаимодействует набор объектов. Посредник способствует слабой связи, не позволяя объектам явно ссылаться друг на друга, и позволяет независимо изменять их взаимодействие.

Реальный пример топологии сети Mesh приведен в следующем вопросе SE:

Посредник по отношению к объектно-ориентированным шаблонам проектирования наблюдателя

Относительно вашего запроса на Посредник добавляет ответственность:

  1. Фасад обеспечивает только интерфейс с существующими подсистемами . Существующие подсистемы не знают самого класса Facade.

  2. Посредник знает об объектах коллеги . Это позволяет общаться между разными коллегами. В примере, который я привел в связанном вопросе, ConcreteMediator ( NetworkMediator ) отправляет уведомления о регистрации и отмене регистрации события одного коллеги всем остальным коллегам.

...