Фасад против посредника

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

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

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

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

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


person Community    schedule 27.01.2009    source источник


Ответы (8)


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

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

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

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

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

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

Код клиента:

 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 — это частный объект пакета, который имеет метод «отладки». Таким образом, Фасад не добавляет функциональности, а просто делегирует некоторые существующие объекты.

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

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

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

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

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

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

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

person OscarRyz    schedule 27.01.2009
comment
Отличное объяснение. У меня есть вопрос, связанный с этим. То, как составлены ReentrantLock и AbstractQueueSynchronizer (AQS), соответствует ли это примеру шаблона Facade? Я имею в виду, что ReentrantLock раскрывает только функциональность AQS, которая присутствует внутри него как подсистема. - person AKS; 30.09.2013
comment
Ответ @RayTayek противоречит вашему ответу? Протокол вашего посредника однонаправленный, верно? - person Narek; 18.11.2015
comment
Я не смог найти ни одного сайта (включая википедию), где говорилось бы, что посредник добавляет новые функции. Можете ли вы указать некоторые ссылки? - person developer; 02.09.2016
comment
@developer вот ссылка, посмотрите внизу. - person Dario Fumagalli; 04.03.2018

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

Это работает следующим образом:

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

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

person Ray Tayek    schedule 13.06.2015

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

Фасад: как на стоянке, когда звонишь

parkingLot.Out(car1);

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

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

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

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

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

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


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

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

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

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

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

person yoyo    schedule 31.05.2013

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

person duffymo    schedule 27.01.2009
comment
Извините, но эта разница на самом деле неверна, ответ mmr правильный. Хотя я тоже поверил так же, как и вы, когда первый раз на них посмотрел - person Robert Gould; 27.01.2009

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

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

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

person Hwisung Im    schedule 12.01.2011

Вы можете найти подробную информацию о шаблоне Facade в этом вопросе SE:

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

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

Реальный пример (авиарейс+бронь отеля) доступен в этом посте:

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

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

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

Шаблоны объектно-ориентированного проектирования посредника и наблюдателя

Что касается вашего запроса на Mediator добавляет ответственность:

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

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

person Ravindra babu    schedule 08.08.2016

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

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

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

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

person Mohammad Akbari    schedule 16.05.2018