[解決済み] ファサード vs. メディエーター
質問
この2つのパターンの違いについて調べてみました。
facadeはサブシステムへのアクセスをカプセル化し、mediatorはコンポーネント間のインタラクションをカプセル化すると理解しています。
サブシステムのコンポーネントはfacadeを意識しませんが、コンポーネントはmediatorを意識することが明らかであることを理解しました。
私は現在、App.Config、SQLに格納されたユーザー設定、アセンブリ情報などの設定情報を取得する方法をカプセル化するためのファサードと、異なるWindowsフォーム間のナビゲーションのためのメディエータを使用しています。
しかし、ほとんどのサイトでは、メディエーターが「機能を追加する」と指摘されています。これは何を意味するのでしょうか。Mediatorはどのように機能を追加するのでしょうか?
どのように解決するのですか?
<ブロッククオート...ほとんどのサイトでは、Mediatorが「機能を追加する」と指摘しています...
は ファサード は、既存の機能を別の視点から公開するだけです。
このような メディエーター は、異なる既存の機能を組み合わせて新しい機能を作成するため、機能を追加します"。
次のような例を見てみましょう。
あなたはロギングシステムを持っています。そのロギングシステムから、ファイル、ソケット、またはデータベースへログを記録することができます。
ファサード設計パターンを使用すると、既存の機能からのすべての関係を、ファサードが公開する単一のquot;インターフェイス;の背後に隠すことができます。
クライアント コード。
Logger logger = new Logger();
logger.initLogger("someLogger");
logger.debug("message");
実装は多くのオブジェクトの相互作用を伴うかもしれません。しかし、最終的には、その機能はすでに存在しているのです。おそらく、"debug"メソッドは次のように実装されるでしょう。
実装です。
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" メソッドを持つ package-private オブジェクトになります。 このように、Facadeは機能を追加しているのではなく、既存のオブジェクトに委譲しているだけなのです。
一方、Mediator は異なるオブジェクトを組み合わせて新しい機能を追加します。
同じClientのコードです。
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();
}
}
}
このコードでは、ログを記録する適切なチャンネルを作成し、そのチャンネルにログを記録させるビジネスロジックを含むのが Mediator です。Mediator は機能を作成します。
もちろん、ポリモーフィズムを用いたより良い実装方法もありますが、ここでは、既存の機能を組み合わせて新しい機能を追加する方法を紹介します(私のサンプルではあまり紹介できませんでした)。このように、Mediatorは異なるオブジェクトの間を仲介することになります。
最後に ファサード は構造的なパターン、つまりオブジェクトの構成を記述しているのに対して メディエーター は動作、つまりオブジェクトが相互作用する方法を記述しています。
参考になれば幸いです。
関連
-
[解決済み] 静的クラスとシングルトンパターンの違い?
-
[解決済み】リレーショナルデータベースデザインパターン?[クローズド]
-
[解決済み】インターフェイスを作成するタイミングはどのように判断するのでしょうか?
-
[解決済み】MVCにおけるビジネスロジック【終了しました
-
[解決済み】REST APIのログインパターン
-
[解決済み] Observerデザインパターンと "Listeners "の比較
-
[解決済み] Hystrixが採用しているBulkhead Patternとは何ですか?
-
[解決済み] PHPプロジェクトにおいて、ヘルパーオブジェクトを保存し、アクセスし、整理するためにどのようなパターンが存在するのでしょうか?[クローズド]
-
[解決済み] Mediator Vs Observer オブジェクト指向デザインパターン
-
[解決済み] Springフレームワークで使われているデザインパターンとは?[クローズド]
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] シングルトン・パターンの欠点やデメリットは何ですか?[クローズド]
-
[解決済み] 静的クラスとシングルトンパターンの違い?
-
[解決済み】ラッパークラスとは何ですか?
-
[解決済み】インターフェイスを作成するタイミングはどのように判断するのでしょうか?
-
[解決済み】MVCにおけるビジネスロジック【終了しました
-
[解決済み】ファサードデザインパターンとは何ですか?
-
[解決済み] コード内のスイッチをなくす方法【非公開
-
[解決済み] ソーシャルネットワークにアクティビティストリームを実装する方法
-
[解決済み] Mediator Vs Observer オブジェクト指向デザインパターン
-
[解決済み] Springフレームワークで使われているデザインパターンとは?[クローズド]