... 대부분의 사이트는 중재자가 "기능을 추가"한다고 지적합니다 ...
외관 만 다른 관점에서 기존의 기능을 제공합니다.
중재자는 이 새로운 하나를 만들 수있는 다른 기존 기능을 결합하기 때문에 기능 "을 추가합니다."
다음 예를 살펴보십시오.
로깅 시스템이 있습니다. 해당 로깅 시스템에서 파일, 소켓 또는 데이터베이스에 로깅 할 수 있습니다.
파사드 디자인 패턴을 사용하면 파사드가 노출하는 단일 "인터페이스"뒤에있는 기존 기능의 모든 관계를 "숨길"것입니다.
클라이언트 코드 :
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();
}
}
}
이 코드에서 중개자는 로그 할 적절한 "채널"을 작성하고 해당 채널에 로그인하는 비즈니스 로직을 포함하는 것입니다. 중재자는 기능을 "만들고"있습니다.
물론 다형성을 사용하여이를 구현하는 더 좋은 방법이 있지만 여기서 요점은 중재자가 기존 기능을 결합하여 새로운 기능을 "추가"하는 방법을 보여주는 것입니다 (제 샘플에서는별로 죄송하지 않음). 중재자를 상상해보십시오. 데이터베이스에서 로그 할 원격 호스트는 클라이언트를 만들고 마지막으로 해당 클라이언트 인쇄 스트림에 로그 메시지를 기록합니다. 이런 식으로 중재자는 서로 다른 대상 사이를 "중재"합니다.
마지막으로 파사드 는 구조적 패턴입니다. 즉, 객체의 구성을 설명하는 반면 매개자 는 행동 적입니다. 즉, 객체가 상호 작용하는 방식을 설명합니다.
이게 도움이 되길 바란다.