Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns Fa和xE7;艾德与调解人_Design Patterns_Facade_Mediator - Fatal编程技术网

Design patterns Fa和xE7;艾德与调解人

Design patterns Fa和xE7;艾德与调解人,design-patterns,facade,mediator,Design Patterns,Facade,Mediator,我一直在研究这两种模式之间的区别 我知道facade封装了对子系统的访问,mediator封装了组件之间的交互 我知道子系统组件不知道facade,而as组件显然知道mediator 我目前正在使用facade来封装检索配置信息的方法,例如App.Config、存储在SQL中的用户设置、程序集信息等,以及用于在不同windows窗体之间导航的中介 然而,大多数网站指出,中介“增加了功能”。这是什么意思?mediator如何添加功能?我正在使用mediator添加日志文件功能 它的工作原理如下:

我一直在研究这两种模式之间的区别

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

我知道子系统组件不知道facade,而as组件显然知道mediator

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


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

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

它的工作原理如下:

  • Obj A告诉调解人它需要做点什么
  • 中介将消息发送到各种客户机对象
  • Obj B做Obj A需要的事情,并通过中介器发送适当的消息
  • 同时,objc也由中介器发送这两条消息,并记录结果。这样,我们可以从日志文件中获取用户统计信息
  • Obj D也可以是一个错误检查器,因此,如果Obj B响应Obj A的请求是不可能的,则Obj D可以是向用户报告该请求的东西。错误现在可以记录在与常规活动不同的文件中,并且可以使用其他一些Obj a不应该真正关心的方式来表现(嘟嘟声,无论什么)

我认为区别在于方向性:facade是客户端和facade之间的单向通信;中介可以是双向对话,消息在客户机和中介之间来回流动

…大多数网站都指出中介“增加了功能”

facade仅从不同的角度公开现有功能

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

以以下为例:

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

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

客户端代码:

实现可能涉及许多对象的交互。但最终,该功能已经存在。“调试”方法的实现方式可能如下所示:

实施:

该功能已存在。正面只会隐藏它。在这种假设的情况下,LoggerManager处理正确记录器的创建,LoggerImpl是一个包私有对象,具有“debug”方法。通过这种方式,Facade并没有添加功能,它只是将其委派给一些现有对象

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

相同的客户端代码:

实施:

在这段代码中,中介是一个包含业务逻辑的中介,用于创建适当的“通道”进行日志记录,并将日志记录到该通道中。中介正在“创建”功能

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

最后,facade是一种结构模式,即它描述对象的组成,而mediator是一种行为模式,即它描述对象交互的方式

我希望这有帮助

从“设计模式”一书中,中介模式的关键描述如下: “它(一个中介)充当小部件(即“一组相互依赖的对象”)的通信枢纽。”

换句话说,中介对象是唯一的超对象,它知道一组协作对象中的所有其他对象以及它们应该如何相互交互。所有其他对象都应该与中介对象交互,而不是相互交互

相反,facade是子系统中一组接口的“统一接口”,供子系统的使用者使用,而不是在子系统的组件之间使用。

举个简单的类比:

门面:像停车场一样,随时待命

parkingLot.Out(car1);
mab是一个简单的链条工程:

{
  car1.StartEngin();      
  attendant.charge();
  car1.driverOut();
}
调解人:就像红绿灯一样

光和车之间有相互作用

汽车是由国家控制的

我想这可能是中介“添加功能”


关于定义:

立面类型:结构

调解人类型:行为型

facade更关心组件包含在统一界面中


mediator关注的是如何在相关模式下一组对象进行交互,他说:Facade(185)与mediator的不同之处在于它抽象了对象的子系统,以提供更方便的接口。它的协议是单向的;也就是说,Facade对象对子系统类发出请求,但反之亦然。相反,Mediator支持同事对象不提供或不能提供的合作行为,协议是多向的。

您可以在这个问题中找到有关Facade模式的详细信息:

Facade
为复杂系统提供了一个简单统一的界面

真实世界示例(cleartrip f
 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();
               }
      }
 }
parkingLot.Out(car1);
{
  car1.StartEngin();      
  attendant.charge();
  car1.driverOut();
}