我一直在研究这两种模式之间的差异。

我知道,facade封装了对子系统的访问,而mediator封装了组件之间的交互。

我知道子系统组件不了解外观,而组件显然不了解介体。

我目前正在使用外观来封装检索配置信息的方法,例如App.Config,存储在SQL中的用户设置,程序集信息等,以及用于在不同Windows窗体之间导航的介体。

但是,大多数站点都指出中介程序是“添加功能”。这是什么意思?调解员如何添加功能?

最佳答案



外观仅从不同的 Angular 公开现有功能。

中介程序“添加”功能,因为它结合了不同的现有功能来创建新功能。

请看以下示例:

您有一个日志记录系统。从该日志记录系统,您可以登录到文件,套接字或数据库。

使用立面设计模式,您可以将现有功能中的所有关系“隐藏”在立面所公开的单个“接口(interface)”后面。

客户代码:

 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”方法的程序包专用对象。这样,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();
               }
      }
 }

在此代码中,调解器是一个包含业务逻辑的调解器,该逻辑创建一个适当的“通道”进行记录,并使该日志进入该通道。中介正在“创建”功能。

当然,有更好的方法可以使用多态性来实现这一点,但是这里的要点是展示调解器如何通过结合现有功能(在我的示例中并没有表示非常抱歉)来“添加”新功能,但是请想象一下调解器,请阅读从数据库中登录的远程主机,然后创建一个客户端,最后将日志消息写入该客户端打印流。这样,中介器将在不同对象之间“中介”。

最后,外观是一种结构模式,它描述了对象的组成,而中介者是一种行为,即,描述了对象交互的方式。

我希望这有帮助。

关于design-patterns - 外立面与调解员,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/481984/

10-10 22:14