我一直在研究这两种模式之间的差异。
我知道facade封装了对子系统的访问,而mediator封装了组件之间的交互。
我知道子系统组件不知道facade,而as组件显然知道中介器。
我目前正在使用facade来封装检索配置信息的方法,例如App.Config、存储在SQL中的用户设置、程序集信息等,以及用于在不同窗口窗体之间导航的中介。
然而,大多数网站指出,中介器“增加了功能”。他们这样说是什么意思?mediator如何添加功能?
发布于 2009-01-27 04:53:08
...most站点指出,中介器“添加了功能”...
外观仅从不同的角度公开现有功能。
mediator“添加”了功能,因为它组合了不同的现有功能来创建新的功能。
下面是一个例子:
您有一个日志记录系统。从该日志记录系统中,您可以记录到文件、套接字或数据库。
使用外观设计模式,您将在外观公开的单个“接口”后面“隐藏”现有功能的所有关系。
客户端代码:
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是一个具有“调试”方法的包私有对象。这样,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();
}
}
}
在此代码中,中介器包含业务逻辑,以创建适当的“通道”进行日志记录,并将日志记录到该通道中。中介者正在“创建”功能。
当然,有更好的方法可以使用多态性来实现这一点,但这里的重点是展示中介如何通过组合现有功能来“添加”新功能(在我的示例中没有显示太多遗憾),但想象一下中介,从数据库读取要记录的远程主机,然后创建一个客户端,最后将日志消息写入该客户端打印流。这样,中介者将在不同的对象之间进行“调停”。
最后,外观是一种结构化模式,即它描述了对象的组成,而中介是一种行为模式,即它描述了对象交互的方式。
我希望这能帮到你。
发布于 2009-01-27 01:03:33
我正在使用mediator来添加日志文件功能。
它是这样工作的:
发布于 2015-06-13 15:25:22
在相关的模式下,gof说: Facade (185)与Mediator的不同之处在于,它抽象了对象的子系统,以提供更方便的接口。它的协议是单向的;也就是说,外观对象发出子系统类的请求,反之亦然。相反,Mediator支持同事对象不能或不能提供的协作行为,并且协议是多方向的。
https://stackoverflow.com/questions/481984
复制相似问题