...ほとんどのサイトは、メディエーターが「機能を追加する」と指摘しています...
ファサードは、唯一異なる視点からの既存の機能を公開します。
メディエータは、それが新しいものを作成するために、別の既存の機能を兼ね備えているので機能「を追加します」。
次の例を見てください。
ロギングシステムがあります。そのログシステムから、ファイル、ソケット、またはデータベースのいずれかにログを記録できます。
ファサードデザインパターンを使用すると、ファサードが公開する単一の「インターフェイス」の背後にある既存の機能からすべての関係を「隠す」ことができます。
クライアントコード:
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();
}
}
}
このコードでは、メディエーターは、ログに記録する適切な「チャネル」を作成し、そのチャネルにログを作成するためのビジネスロジックを含むものです。メディエーターは機能を「作成」しています。
もちろん、ポリモーフィズムを使用してこれを実装するより良い方法がありますが、ここでのポイントは、メディエーターが既存の機能を組み合わせることによって新しい機能を「追加」する方法を示すことです(私のサンプルではあまり申し訳ありませんでした)が、メディエーターを想像してください、読んでくださいデータベースから、ログを記録するリモートホスト、次にクライアントを作成し、最後にそのクライアントにログメッセージを印刷ストリームに書き込みます。このようにして、メディエーターは異なるオブジェクト間を「仲介」します。
最後に、ファサードは構造パターンです。つまり、オブジェクトの構成を記述し、メディエーターは動作を記述します。つまり、オブジェクトが相互作用する方法を記述します。
これがお役に立てば幸いです。