1.场景
有一天我想组装一台配置比较高的电脑,但是我是电脑小白不懂电脑配置,还想打游戏,肿么办?朋友小李就给我讲了组装电脑的流程;
首先需要去了解cpu,然后是主板,显卡,硬盘......讲了一大推,听完之后瞬间头大了,我就问难道就没有根据我的要求给我完成组装电脑的地方吗?朋友说有啊。。直接去电子市场。其实这里的电子市场就相当于我们这次所要说的外观。有了它我们就不用直接去了解那些详细配置的问题,只管要求就行;
把上面的抽象到代码里面其实好比就是客户端为了完成某个功能,需要调用子系统的好几个功能才能实现,这里暂且就称作为模块A 模块B 模块C 吧,对于客户端而言就需要知道这三个模块的功能,就好比是我们的电脑组件,需要知道更详细的信息才能组装一样,非常麻烦。如果要想很简单的要求就能实现还不需要知道具体的组件信息详情,哪这里就需要用到Facade(外观模式);
抽象图如下所示:
示例代码:
a模块接口
a接口实现
同理实现B和C接口
定义外观对象类:
客户端使用:
运行结果:
外观模式优缺点:
1.松散耦合
松散了客户端和子系统之间的耦合关系,方便子系统更好的扩展
2.简单易用
客户端不需要了解子系统的更多细节,只需要和外观打交道即可,方便了客户端的使用,相当于子系统提供了一站式服务;
3.更好的划分访问层次
隐藏了实现细节,让实现逻辑一气呵成,只把功能集中暴露即可;
缺点:过多或者不合理的facade可能让人迷惑,到底是调用facade好呢还是直接调用模块好;