题
我一直在研究这两者之间的区别模式。
我的理解是,封装门面访问的一个子系统和调解人封装之间的相互作用的部件。
我的理解是,子系统组件是不知道的门面,在作为部件都显然认识到调解人。
目前,我正在使用一个门面对封装的方法检索配置的信息,例如应用程序。配置、用户定存在SQL,大会的信息等,和一个调解人之间导航不同窗口的形式。
然而,大多数网站指出,调解人",增加了功能"。他们是什么意思?如何调解人添加功能?
解决方案
...大多数网站指出,调解员补充说:“功能” ... 的
的门面强>仅暴露出从不同的角度的现有的功能。
的介体强>“加”功能,因为它结合了不同的现有的功能,以建立一个新的。
以下面的示例:
您有测井系统。从日志记录系统,您可以登录到一个文件,一个插座,或到数据库。
使用门面设计模式你会“隐藏”所有从后面一个“接口”现有的功能,该门面暴露一个关系。
客户端的代码:
Logger logger = new Logger();
logger.initLogger("someLogger");
logger.debug("message");
在实施可能涉及许多对象的相互作用。但在年底,功能已经存在。可能是“调试”方法是这样实现的:
实现:
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是具有“调试”方法的封装私有对象。通过这种方式,立面不加入功能它只是委派到一些现有对象。
在另一方面,介体通过组合不同的对象添加新的功能。
相同的客户端代码:的
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();
}
}
}
在此代码,所述介体是包含业务逻辑来创建适当的“信道”进行登录并且还使日志到该信道的一个。介体“创建”功能。
当然,也有实现这个使用多态更好的方法,但这里的关键是要展示如何调解员通过组合现有功能“增加了”新功能(我的样本中并没有表现出非常遗憾),但想象调解员,从数据库中读取远程主机在哪里登录,然后创建一个客户端,最后写入到客户端打印流日志信息。通过这种方式,介体将是“介导”的不同对象之间。
最后,在门面强>是一种结构模式,即它描述的对象的组合物,而在介体强>是一种行为,也就是,它描述的方式的对象进行交互。
我希望这有助于。
其他提示
我使用的是调解人增加登录文件的功能。
它的工作原理是这样的:
- Obj一个告诉调解人需要的东西做的。
- 调解人的消息发送到各种各样的客户对象。
- Obj B做的事情Obj需要,并发出一个适当的信息通过的调解人。
- 与此同时,Obj C也被发送消息的调解人,并记录结果。这样,我们可以得到用户的统计数字登录文件。
- Obj D可能是一个错误的检查程序,所以,如果Obj B响应,Obj一的要求是不可能的,Obj D可能的事情,报告的用户。错误的,现在可以登录,在一个不同的文件比规则活动,并能使用一些其他装置的行为(哔哔声,无论),Obj一个应该不是真的关注。
下相关模式, GOF 说:门面(185)从中介不同之处在于它抽象对象到一个子系统提供更方便的接口。其协议是单向的;也就是说,门面对象进行子系统类的请求,而不是相反。与此相反,使中保协作行为同事对象不或不能提供,并且协议是多向的。
举一个简单的类比:
门面:喜欢的停车场,当呼叫
parkingLot.Out(car1);
的MAb是简单的链作品:
{
car1.StartEngin();
attendant.charge();
car1.driverOut();
}
中保:像交通灯
有轻和汽车之间的相互作用,
和汽车被控制通过它的状态。
我虽然这也许是在介体“增加功能” 强>
和有关定义:
门面的类型:<强>结构强>
Mediator的类型:的行为强>
门面更关心的部件强>分别的包含强>在统一接口强>,
和介体关注的如何强>的一组物体的交互强>
我认为区分是定向:门面是客户端和门面之间的单向通信;介体可以是双向的对话,与来回流动在客户端和介体之间的消息。
从“设计模式”一书中,中保图案的KEY被描述为如下: “它(介体)作为用于小部件(即, 'A' 组相互依赖的对象)。通信的HUB”
在换言之,介体对象是熟知的一组协作对象以及应如何彼此交互中的所有其他对象的唯一超对象。所有其他对象应与介体对象交互,而不是彼此。
在相反,正面是一个“统一的接口”为子系统中的一组接口 - 用于由消费者子系统的 - 而不是该子系统的组件之间的
你可以找到细节约的立面模式,这本身的问题:
Facade
提供了一种简单的和统一的接口向复杂的系统。
现实世界的例子(最后一分钟的飞行和酒店预订)是用在这个员额:
调解员 模式:定义的一个目封装了如何设定对象的相互作用。调解人促进松散耦合通过保持对象参照每个其他明确,并且它可以让你改变它们的相互作用的独立。
一个真正的世界施网络拓扑结构已提供在下本身的问题:
关于您的查询关于调解增加了的责任:
墙面提供了唯一接口现有的子系统.现有子系统都没有意识到外墙类本身。
调解人知道有关同事的对象.它使之间的通信,不同的同事。在例如我援引链接的问题, ConcreteMediator(NetworkMediator)发送通知的登记和注销事件的一位同事的所有其他同事。
两个强加某种策略的另一组对象。的门面强>强加策略从上面,和中保强>施加从下面的策略。使用的门面强>是可见的和约束,同时采用的中保强>是不可见的和启用。
的门面时要提供一个简单和特定的接口,以一组对象具有复杂的和通用的接口强>图案被使用。
的中保强>图案还规定的策略。然而,尽管门面可见和制约的方式强加其政策,中保规定在隐蔽性和无约束的方式及其政策。
敏捷软件开发,原则,模式与实践罗伯特C.马丁。