有时,我们想要启动某个系统,需要调用很多个接口,而关掉这个系统,也需要很多步骤。在一个地方调用也罢,但是如果还有其它地方也需要调用,这时候就显得比较繁琐,而且我需要知道内部的细节,才能正常的启动和关闭系统
外观模式(Facade Pattern):为子系统或子模块的接口提供一个统一的外观界面,提供一个高层接口,使得子系统或子模块更加容易使用。外观模式又称为门面模式,它是一种对象结构型模式。
Client: 客户系统或客户类
Facade: 外观角色,外观角色是在客户端直接调用的角色
SubSystem: 子系统角色,在软件系统中可以同时有一个或者多个子系统角色
package com.pattern.facade; public class Client { public static void main(String args[]) { Startup startup = new Startup(); startup.startup(); } } package com.pattern.facade; public class Startup { private AppConfig config = new AppConfig(); private AppHandler handler = new AppHandler(); private AppUpdater updater = new AppUpdater(); public void startup() { config.init(); handler.init(); updater.init(); } } package com.pattern.facade; public class AppConfig { public void init() { } } package com.pattern.facade; public class AppHandler { public void init() { } } package com.pattern.facade; public class AppUpdater { public void init() { } }
外观模式优点:
1 对客户端屏蔽子系统组件,使得子系统使用起来更加容易。
2 提供一个访问子系统的统一入口,并不影响用户直接使用子系统类。
外观模式缺点:
1 外观模式最大的缺点在于违背了开闭原则,当新增新的子系统或者移除旧的子系统后需要修改外观类。大多数情况下修改影响比较小,如果修改影响比较大,则可以通过引入抽象外观类在一定程度上解决此问题。
1 系统启动流程一般包含多个模块初始化,关闭流程一般包含多个模块的销毁,可以提取专门的外观类,实现初始化和关闭接口,封装这些模块的初始化及销毁操作,这样就可以方便的控制系统的启动和关闭,便于后续维护。
2 网络框架一般包含多个业务逻辑,例如建立连接、绑定端口、监听数据等,这时通过建立外观类,封装复杂的内部通讯逻辑,提供更加简洁的高层API接口,方便外部系统的使用,也降低了外部系统和框架的耦合度。
1 外观类可以用单例类,也可以用普通类,看实际情况处理。
2 外观类包含子系统的接口使用,不增加新的业务逻辑。
原文:http://www.cnblogs.com/fanyang219/p/6404498.html