1.定义
门面模式也叫外观模式
门面模式为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用
门面模式通过定义一个一致的接口,用以屏蔽内部子系统的细节,使得调用端只需跟这个接口发生调用,而无需关心这个子系统的内部细节
在这个结构图中,出现了两个⻆⾊:
- ⻔⾯(Facade)⻆⾊ :客户端可以调⽤这个⻆⾊的⽅法。此⻆⾊知晓相关的(⼀个或者多个)⼦系统的功能和责任。在正常情况下,本⻆⾊会将所有从客户端发来的请求委派到相应的⼦系统去。
- ⼦系统(SubSystem)⻆⾊ :可以同时有⼀个或者多个⼦系统。每个⼦系统都不是⼀个单独的类,⽽是⼀个类的集合(如上⾯的⼦系统就是由ModuleA、ModuleB、ModuleC三个类组合⽽成)。每个⼦系统都可以被客户端直接调⽤,或者被⻔⾯⻆⾊调⽤。⼦系统并不知道⻔⾯的存在,对于⼦系统⽽⾔,⻔⾯仅仅是另外⼀个客户端⽽已。
2.项目应用
我们现在有⼀个OA系统,OA要对外提供服务要经过三个步骤:
// 启动MySQL应用集群 public class DatabaseManager { public void startDbCluster(){ System.out.println("正在启动mysql集群"); } } // 启动Redis集群 public class CacheManager { public void initRedis(){ System.out.println("正在启动redis集群"); } } // 启动Web应用服务器 public class WebServerManager { public void startWebApp(){ System.out.println("正在启动web服务器"); } }
如果没有额外操作,客户端必须手动运行这些组件,这极大提高了客户端的复杂度
public class Client { public static void main(String[] args) { new DatabaseManager().startDbCluster(); new CacheManager().initRedis(); new WebServerManager().startWebApp(); } }
好的做法是引入门面Facade,让应用开发方提供操作,为客户端提供最简单的操作入口即可
public class ApplicationFacade { private CacheManager cacheManager = new CacheManager(); private DatabaseManager dbManager = new DatabaseManager(); private WebServerManager webManager = new WebServerManager(); public void initSystem(){ dbManager.startDbCluster(); cacheManager.initRedis(); webManager.startWebApp(); } }
优化后的Client只需要⾯对ApplicationFacade⻔⾯,不需要再关注具体细节
public class Client { public static void main(String[] args) { ApplicationFacade app = new ApplicationFacade(); app.initSystem(); } }
3.优缺点
3.1.优点
松散耦合: ⻔⾯模式松散了客户端与⼦系统的耦合关系,让⼦系统内部的模块能更容易扩展和维护。
简单易⽤: ⻔⾯模式让⼦系统更加易⽤,客户端不再需要了解⼦系统内部的实现,也不需要跟众多⼦ 系统内部的模块进⾏交互,只需要跟⻔⾯类交互就可以了。
更好的划分访问层次: 通过合理使⽤Facade,可以帮助我们更好地划分访问的层次。有些⽅法是对系 统外的,有些⽅法是系统内部使⽤的。把需要暴露给外部的功能集中到⻔⾯中,这样既⽅便客户端使 ⽤,也很好地隐藏了内部的细节。
3.2.
不符合开闭原则,如果要修改某⼀个⼦系统的功能,通常门面类也要⼀起修改