1. ホーム
  2. design-patterns

[解決済み] ファサード vs. メディエーター

2023-04-11 15:37:21

質問

この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は異なるオブジェクトの間を仲介することになります。

最後に ファサード は構造的なパターン、つまりオブジェクトの構成を記述しているのに対して メディエーター は動作、つまりオブジェクトが相互作用する方法を記述しています。

参考になれば幸いです。