外观模式(Facade Pattern)可以为复杂系统提供简单的接口。
问题提出
想象我们要创建一个手机APP,其中有一个功能是向用户推送消息。
作为极简的框架,我们有一个消息Message类承载消息内容,以及消息服务类NotificationServer 处理连接服务器、验证用户、发送消息、断开连接等任务。
根据这个框架,我们来完善下。
创建Connection类,它有disconnect方法。
创建AuthToken类。
接着补充NotificationServer 。
现在,我们到main方法里使用这些类。
这里有个问题。
每次我们向用户推送消息时,我们都得执行所有这些步骤:创建NotificationServer、连接、认证、创建消息并进行发送、断开等,太多步骤了!
使用外观模式可以解决这个问题。
解决方案
当前的结构是这样的。
这个结构有两个问题。
第一个问题我们前面已说过了,太多的步骤需要遵循。
第二个问题,main为了发送消息依赖了4个类,太多耦合了。如果应用程序有10个类要发送消息,那这10个类都要依赖这个4个类。后面如果要修改这4个类,所有要发送消息的类都要受到影响。偶合性太强!
我们要减少耦合!
外观模式就是用于解决这个问题。
我们来看看如何做。
引入一个新类NotificationService,它有一个send方法。所有的复杂的步骤都由send方法来实现。
main类只跟NotificationService类有依赖,其它需要发送消息的类也只与NotificationService类有耦合。
这就减少了耦合。
复杂的4个实现类的修改不会影响到Main类以及其他需要发送消息的类。
这就叫做外观模式(Facade Pattern)。
NotificationService充当了我们的消息推送系统的外观或前端。
代码实现
创建NotificationService类,将原先main里发送消息的相关步骤复制到send方法里。
这样以后如果需要修改NotificationServer、Connection、AuthToken、Message类时,影响的只有NotificationService类,不影响其它需要推送消息的类。
需要推送消息时,只需创建一个NotificationServer对象,并调用其send方法即可。
小结
外观模式允许我们为复杂的应用程序提供一个简单的接口。