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


83

Я досліджував різницю між цими двома моделями.

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

Я розумію, що компоненти підсистеми не знають про фасад, де як компоненти, очевидно, знають про посередника.

Зараз я використовую фасад для інкапсуляції методу отримання інформації про конфігурацію, наприклад, App.Config, налаштування користувача, що зберігаються в SQL, інформація про збірку тощо, а також посередник для навігації між різними формами Windows.

Однак більшість сайтів зазначають, що посередник «додає функціональність». Що вони мають на увазі під цим? Як посередник додає функціональність?

Відповіді:


103

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

Фасад тільки оголює існуючі функціональні можливості під іншим кутом зору.

Посередник «додає» функціональність , оскільки він поєднує в собі різні існуючі функціональні можливості для створення нового.

Візьмемо такий приклад:

У вас є система реєстрації. За допомогою цієї системи реєстрації ви можете увійти у файл, сокет або базу даних.

Використовуючи шаблон дизайну фасаду, ви зможете "приховати" всі взаємозв'язки від існуючих функціональних можливостей за єдиним "інтерфейсом", який виставляє фасад.

Код клієнта:

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

У цьому коді посередником є ​​той, який містить бізнес-логіку для створення відповідного "каналу" для реєстрації, а також для входу в цей канал. Посередник "створює" функціонал.

Звичайно, є кращі способи реалізувати це за допомогою поліморфізму, але суть тут у тому, щоб показати, як посередник "додає" нову функціональність, поєднуючи існуючу функціональність (у моїй вибірці не дуже сильно шкодував), але уявіть собі посередника, прочитайте з бази даних віддалений хост, куди входити, потім створює клієнта і, нарешті, пише в цей потік друку клієнта повідомлення журналу. Таким чином посередник буде "посередництвом" між різними об'єктами.

Нарешті, фасад - це структурний шаблон, тобто він описує склад об’єктів, тоді як посередник є поведінковим, тобто описує спосіб взаємодії об’єктів.

Сподіваюся, це допоможе.


Чудове пояснення .. У мене є питання, пов’язане з цим. Спосіб складання ReentrantLock та AbstractQueueSynchronizer (AQS) відповідає прикладу візерунка фасаду? Я маю на увазі ReentrantLock виставляє лише функціональність AQS, яка присутня всередині нього як підсистема.
AKS

Відповідь @RayTayek суперечить вашій відповіді? Протокол вашого посередника односпрямований, так?
Нарек

Я не зміг знайти жодного веб-сайту (включаючи wikipedia), який би заявив, що посередник додає нові функції. Ви можете вказати кілька посилань?
розробник

@developer ось посилання , подивіться внизу.
Даріо Фумагаллі,

13

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

Це працює так:

  • Obj A каже посереднику, що йому потрібно щось зробити.
  • Посередник надсилає повідомлення різним клієнтським об'єктам.
  • Obj B робить те, що потрібно Obj A, і надсилає відповідне повідомлення назад через посередника.
  • Тим часом Obj C також надсилає обидва повідомлення посередником і реєструє результати. Таким чином, ми можемо отримати статистику користувачів із файлів журналів.
  • Obj D також може бути засобом перевірки помилок, так що якщо Obj B відповість, що запит Obj A неможливий, Obj D може бути тим, що повідомляє про це користувача. Тепер помилки можна реєструвати в іншому файлі, ніж звичайна діяльність, і вони можуть використовувати інші засоби поведінки (звукові сигнали, що завгодно), які Obj A насправді не повинен стосуватися.

12

за відповідними шаблонами, Гоф каже: Фасад (185) відрізняється від Посередника тим, що він абстрагує підсистему об’єктів, щоб забезпечити більш зручний інтерфейс. Його протокол односпрямований; тобто об'єкти Facade роблять запити на класи підсистеми, але не навпаки. На відміну від цього, Mediator надає спільну поведінку, яку об'єкти колег не надають або не можуть забезпечити, а протокол є багатоспрямованим.


8

Зробіть просту аналогію:

Фасад: як автостоянка, коли дзвонять

parkingLot.Out(car1);

mab бути простим ланцюгом працює:

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

Посередник: як світлофор.

Існує взаємодія між світлом і автомобілем,

і автомобілі контролюються його державою.

Я, хоча, можливо, це посередник, "додає функціональність"


І про визначення:

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

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

фасад, більше стурбований компонентами , містився в уніфікованому інтерфейсі ,

та посередник стосуються того, як взаємодіє сукупність об’єктів .


4

Я вважав, що відмінність спрямована: фасад - це односторонній зв'язок між клієнтом та фасадом; Медіатор може бути двосторонньою розмовою, повідомлення між клієнтом та медіатором протікають вперед і назад.


Вибачте, але ця різниця насправді неправильна, відповідь mmr правильна. Хоча я також вірив так само, як і ви, коли я вперше подивився на них
Роберт Гулд

3

З книги "Шаблони дизайну" КЛЮЧ шаблону Медіатор описується наступним чином: "Він (посередник) діє як ЦЕНТР зв'язку для віджетів (тобто" група "взаємозалежних об'єктів)."

Іншими словами, об’єкт-посередник - єдиний надпроект, який знає всі інші об’єкти в групі об’єктів, що співпрацюють, і те, як вони повинні взаємодіяти між собою. Усі інші об'єкти повинні взаємодіяти з об'єктом-посередником, а не один з одним.

На противагу цьому, фасад - це «уніфікований інтерфейс» для набору інтерфейсів в підсистемі - для використання споживачами підсистеми - не серед компонентів підсистеми.


1

Ви можете знайти детальну інформацію про фасадний малюнок у цьому питанні SE:

Що таке шаблон дизайну фасадів?

Facade забезпечує простий та уніфікований інтерфейс до складної системи.

Приклад із реального світу ( переліт cleartrip + бронювання готелів ) доступний у цій публікації:

Що таке шаблон дизайну фасадів?

Шаблон посередника : Визначте об’єкт, який інкапсулює взаємодію набору об’єктів. Посередник сприяє вільному зчепленню, утримуючи предмети від явного посилання один на одного, і дозволяє вам змінювати їх взаємодію незалежно.

Реальний приклад топології мережі Mesh наведено нижче в питанні SE:

Посередник проти спостерігача об’єктно-орієнтовані шаблони дизайну

Щодо вашого запиту про Mediator додає відповідальність:

  1. Фасад забезпечує лише інтерфейс до існуючих підсистем . Існуючі підсистеми не знають про сам клас Facade.

  2. Посередник знає про предмети колег . Це дозволяє спілкуватися між різними колегами. У прикладі, який я процитував у зв’язаному питанні, ConcreteMediator ( NetworkMediator ) надсилає повідомлення про реєстрацію та скасування реєстрації події одного колеги всім іншим колегам.


1

Обидва нав'язують якусь політику щодо іншої групи об'єктів. Фасад нав'язує політику зверху, а Медіатор - знизу. Використання фасаду є видимим і обмежуючим, тоді як використання посередника є непомітним та уможливленим.

Шаблон " Фасад" використовується, коли потрібно надати простий і специфічний інтерфейс для групи об'єктів, що має складний і загальний інтерфейс.

Посередник модель також накладає політику. Однак, хоча Фасад нав'язував свою політику видимим і стримуючим способом, Медіатор нав'язував свою політику прихованим і необмеженим способом.

Agile Розробка програмного забезпечення, принципи, моделі та практики Роберт С. Мартін.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.