...大多数网站指出中介“增加了功能”...
外观只是从不同的角度展示现有的功能。
中介“添加”功能,因为它结合了不同的现有功能来创建新功能。
举个例子:
你有一个日志系统。从该日志系统,您可以将日志记录到文件、套接字或数据库。
使用外观设计模式,您可以将现有功能的所有关系“隐藏”在外观暴露的单个“界面”后面。
客户端代码:
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();
}
}
}
在此代码中,中介是包含创建适当“通道”以记录日志并将日志放入该通道的业务逻辑的中介。中介正在“创建”功能。
当然,有更好的方法来使用多态性来实现这一点,但这里的重点是展示调解器如何通过结合现有功能“添加”新功能(在我的示例中没有表现出非常抱歉)但想象一下调解器,从数据库中读取远程主机记录的位置,然后创建一个客户端,最后将日志消息写入该客户端打印流。这样,中介将在不同对象之间“调解”。
最后,facade是一种结构模式,即描述对象的组成,而mediator是一种行为模式,即描述方式对象相互作用。
我希望这会有所帮助。