首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Façade与Mediator

Façade与Mediator
EN

Stack Overflow用户
提问于 2009-01-27 00:52:50
回答 8查看 23.4K关注 0票数 88

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

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

我知道子系统组件不知道facade,而as组件显然知道中介器。

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

然而,大多数网站指出,中介器“增加了功能”。他们这样说是什么意思?mediator如何添加功能?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-01-27 04:53:08

...most站点指出,中介器“添加了功能”...

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

mediator“添加”了功能,因为它组合了不同的现有功能来创建新的功能。

下面是一个例子:

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

使用外观设计模式,您将在外观公开的单个“接口”后面“隐藏”现有功能的所有关系。

客户端代码:

代码语言:javascript
运行
复制
 Logger logger = new Logger();
 logger.initLogger("someLogger");
 logger.debug("message");

实现可能涉及许多对象的交互。但是最终,这个功能已经存在了。可能"debug“方法的实现方式如下:

实施:

代码语言:javascript
运行
复制
 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不会添加功能,它只是委托给一些现有的对象。

另一方面,中介器通过组合不同的对象来添加新的功能。

相同的客户端代码:

代码语言:javascript
运行
复制
 Logger logger = new Logger();
 logger.initLogger("someLogger");
 logger.debug("message");

实施:

代码语言:javascript
运行
复制
 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();
               }
      }
 }

在此代码中,中介器包含业务逻辑,以创建适当的“通道”进行日志记录,并将日志记录到该通道中。中介者正在“创建”功能。

当然,有更好的方法可以使用多态性来实现这一点,但这里的重点是展示中介如何通过组合现有功能来“添加”新功能(在我的示例中没有显示太多遗憾),但想象一下中介,从数据库读取要记录的远程主机,然后创建一个客户端,最后将日志消息写入该客户端打印流。这样,中介者将在不同的对象之间进行“调停”。

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

我希望这能帮到你。

票数 107
EN

Stack Overflow用户

发布于 2009-01-27 01:03:33

我正在使用mediator来添加日志文件功能。

它是这样工作的:

  • Obj A告诉中介者它需要做一些事情。
  • 中介者将消息发送到各种客户端对象。
  • Obj B做Obj A所需要的事情,并通过Obj C发送适当的消息。这两个消息也由中介者发送,并记录结果。这样,我们就可以从日志文件中获得用户统计数据。
  • Obj D也可以是一个错误检查器,所以如果Obj B响应Obj A的请求是不可能的,Obj D就可以向用户报告这一点。错误现在可以记录在与常规活动不同的文件中,并且可以使用一些其他方法来表现对象A不应该真正关心的行为(嘟嘟声,诸如此类)。
票数 13
EN

Stack Overflow用户

发布于 2015-06-13 15:25:22

在相关的模式下,gof说: Facade (185)与Mediator的不同之处在于,它抽象了对象的子系统,以提供更方便的接口。它的协议是单向的;也就是说,外观对象发出子系统类的请求,反之亦然。相反,Mediator支持同事对象不能或不能提供的协作行为,并且协议是多方向的。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/481984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档