파사드 vs. 중재자


83

저는이 두 패턴의 차이점을 연구하고 있습니다.

나는 파사드가 서브 시스템에 대한 액세스를 캡슐화하고 중개자가 컴포넌트 간의 상호 작용을 캡슐화한다는 것을 이해합니다.

나는 하위 시스템 구성 요소가 파사드를 인식하지 못하며 구성 요소가 중개자를 분명히 인식한다는 것을 이해합니다.

저는 현재 App.Config, SQL에 저장된 사용자 설정, 어셈블리 정보 등의 구성 정보를 검색하는 방법을 캡슐화하기 위해 파사드를 사용하고 있으며 서로 다른 창 양식 간 탐색을위한 중재자를 사용하고 있습니다.

그러나 대부분의 사이트는 중재자가 "기능을 추가"한다고 지적합니다. 이것은 무엇을 의미합니까? 중재자는 기능을 어떻게 추가합니까?

답변:


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은 "디버그"메소드가있는 패키지 전용 객체입니다. 이런 식으로 Facade는 기능을 추가하지 않고 기존 개체에 위임하는 것입니다.

반면에 중재자는 다른 개체를 결합하여 새로운 기능을 추가합니다.

동일한 클라이언트 코드 :

 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)가 구성되는 방식이 Facade 패턴의 예에 맞습니까? ReentrantLock은 하위 시스템으로 내부에 존재하는 AQS의 기능 만 노출한다는 것을 의미합니다.
AKS

@RayTayek 답변이 귀하의 답변과 모순됩니까? 중재자의 프로토콜은 단방향입니다. 그렇죠?
Narek

중재자가 새로운 기능을 추가한다는 사이트 (wikipedia 포함)를 찾을 수 없습니다. 몇 가지 참조를 지적 할 수 있습니까?
개발자

여기 @developer 는 참조 입니다. 하단을보십시오.
Dario Fumagalli

13

중재자를 사용하여 로그 파일 기능을 추가하고 있습니다.

다음과 같이 작동합니다.

  • Obj A는 중재자에게 조치가 필요하다고 말합니다.
  • 중개자는 다양한 클라이언트 개체에 메시지를 보냅니다.
  • Obj B는 Obj A가 필요로하는 작업을 수행하고 중재자를 통해 적절한 메시지를 다시 보냅니다.
  • 한편, Obj C는 중재자가 두 메시지를 모두 전송하고 결과를 기록합니다. 이렇게하면 로그 파일에서 사용자 통계를 얻을 수 있습니다.
  • Obj D도 오류 검사기 일 수 있으므로 Obj B가 Obj A의 요청이 불가능하다고 응답하면 Obj D가이를 사용자에게보고 할 수 있습니다. 이제 오류는 일반 활동과 다른 파일에 기록 될 수 있으며 Obj A가 실제로 관심을 가져서는 안되는 다른 수단을 사용하여 작동 (신호음 등) 할 수 있습니다.

12

관련 패턴에서 gof 는 다음 과 같이 말합니다. Facade (185)는 더 편리한 인터페이스를 제공하기 위해 객체의 하위 시스템을 추상화한다는 점에서 Mediator와 다릅니다. 프로토콜은 단방향입니다. 즉, Facade 개체는 하위 시스템 클래스를 요청하지만 그 반대는 아닙니다. 반대로 Mediator는 동료 개체가 제공하지 않거나 제공 할 수없는 협력 동작을 가능하게하며 프로토콜은 다 방향입니다.


8

간단한 비유를 들으십시오.

외관 : 주차장처럼 전화 할 때

parkingLot.Out(car1);

mab는 간단한 체인 작동합니다.

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

중재자 : 신호등처럼.

빛과 자동차 사이에는 상호 작용이 있습니다.

자동차는 그 상태에 의해 통제됩니다.

나는 이것이 "기능을 추가하는"중재자 일지도 모른다


그리고 정의에 대해 :

외관의 유형 : 구조상

중재자 유형 : 행동

더 염려 외관 구성 되었다 포함통합 인터페이스 ,

중재자 는 일련의 객체가 상호 작용 하는 방식 에 관심 이 있습니다 .


4

나는 구별이 방향성이라고 생각했다 : 파사드는 클라이언트와 파사드 사이의 단방향 커뮤니케이션이다. 중개자는 클라이언트와 중개자간에 메시지가 앞뒤로 이동하는 양방향 대화 일 수 있습니다.


미안하지만 그 차이는 실제로 잘못되었습니다 .mmr의 대답은 맞습니다. 내가 처음 그들을 보았을 때 나는 또한 같은 믿고 있지만
로버트 굴드를

3

"Design Patterns"책에서 Mediator 패턴의 KEY는 다음과 같이 설명됩니다. "It (중개자)은 위젯 (즉, 상호 의존적 인 개체의 'a'그룹)에 대한 통신 허브 역할을합니다."

즉, 중재자 개체는 공동 작업 개체 그룹에있는 다른 모든 개체와 서로 상호 작용하는 방법을 알고있는 유일한 상위 개체입니다. 다른 모든 개체는 서로 대신 중재자 개체와 상호 작용해야합니다.

대조적으로, 파사드는 서브 시스템의 구성 요소가 아닌 서브 시스템의 소비자가 사용하기위한 서브 시스템의 인터페이스 세트에 대한 "통합 인터페이스"입니다.


1

이 SE 질문에서 Facade 패턴에 대한 세부 정보를 찾을 수 있습니다.

파사드 디자인 패턴이란?

Facade 복잡한 시스템에 대한 단순하고 통합 된 인터페이스를 제공합니다.

실제 사례 ( cleartrip flight + hotel booking )는이 게시물에서 확인할 수 있습니다.

파사드 디자인 패턴이란?

중재자 패턴 : 개체 집합이 상호 작용하는 방식을 캡슐화하는 개체를 정의합니다. 중재자는 객체가 서로를 명시 적으로 참조하지 못하도록하여 느슨한 결합을 촉진하며 상호 작용을 독립적으로 변경할 수 있습니다.

메시 네트워크 토폴로지의 실제 예가 아래 SE 질문에 제공되었습니다.

중재자 대 관찰자 객체 지향 디자인 패턴

중재자에 대한 귀하의 질의와 관련하여 책임이 추가됩니다.

  1. Facade는 기존 하위 시스템에 대한 인터페이스 만 제공합니다 . 기존 하위 시스템은 Facade 클래스 자체를 인식하지 않습니다.

  2. 중재자는 동료 개체에 대해 알고 있습니다 . 서로 다른 동료 간의 의사 소통을 가능하게합니다. 연결된 질문에서 인용 한 예에서 ConcreteMediator ( NetworkMediator )는 한 동료의 등록 및 등록 취소 이벤트 알림을 다른 모든 동료에게 보냅니다.


1

둘 다 다른 개체 그룹에 일종의 정책을 적용합니다. Facade 는 위에서 정책을 부과 하고 중재자 는 아래에서 정책을 부과합니다. Facade 의 사용 은 가시적이고 제한적인 반면 Mediator 의 사용 은 보이지 않고 활성화됩니다.

외관 이 복잡하고 일반적인 인터페이스를 가지고 개체 그룹에 간단하고 특정 인터페이스를 제공하려는 경우 패턴이 사용됩니다.

중재자 패턴은 또한 정책을 부과한다. 그러나 Facade는 가시적이고 제한적인 방식으로 정책을 부과 한 반면 Mediator 는 숨겨진 제한없는 방식으로 정책을 부과합니다.

애자일 소프트웨어 개발, 원칙, 패턴 및 관행 Robert C. Martin.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.