设计模式系列-门面模式-Facade

案例

要研发一个任务调度服务,用类 ScheduleServer 表示,客户端代码在调用服务时,需要先初始化完成任务是关掉服务来释放资源,初始化任务调度服务时需依次调用如下方法

  • startBooting() , 启动引导程序
  • readSystemConfigFile(),读取系统配置文件
  • init(),初始化资源
  • initializeContext(),初始化上下文
  • initializeListeners(),初始化监听器
  • createSystemObjects(),创建所需的系统对象

关闭任务调度服务时需依次调用的方法

  • releaseProcesses(),释放处理器
  • destroy(),销毁
  • destroySystemObjects(),销毁系统对象
  • destroyListeners(),销毁监听器
  • shutdown(),关闭服务

客户端代码开启服务和关掉服务需要清楚的知道如何调用上面的方法,这样对客户端不仅复杂度高,而且和调度服务的代码耦合在一起,不利于之后的代码维护。
如何解决上面场景遇到的问题呢?通过下面对门面模式的学习,我想你心中肯定会有答案。

门面模式

门面模式,又称外观模式,在 GoF 的《设计模式》一书中,门面模式是这样定义的:

Provide a unified interface to a set of interfaces in a subsystem. Facade Pattern defines a higher-level interface that makes the subsystem easier to use.

翻译成中文:为子系统的一组接口提供一个统一的接口,定义一个高层接口使子系统更好用。

定义中的子系统 该怎么理解呢,子系统可以理解为我们平时开发系统的一个真实子系统,或者一个系统模块和具体的类。

我们定义接口时,比较关心接口的通用性和易用性,有时这两者存在矛盾,需要权衡,如接口力度太细使用起来复杂,接口太粗不够通用。比如我们开头提到的案例,为了保持接口的通用性,我们定义了很多细小的接口,但是客户使用起来较复杂难维护。这时门面模式为提供了一个方案。

门面模式的实现

定义一个Facade 类:ScheduleServerFacade , 提供 startServerstopServer 两个方法来封装启动和关闭服务的详细过程,客户端代码只要调用facade 的两个方法即可。

public class ScheduleServerFacade {

	private final ScheduleServer scheduleServer;
	public ScheduleServerFacade(ScheduleServer scheduleServer){
		this.scheduleServer = scheduleServer;
	}
	public void startServer(){
		scheduleServer.startBooting(); 
		scheduleServer.readSystemConfigFile(); 
		scheduleServer.init(); 
		scheduleServer.initializeContext(); 
		scheduleServer.initializeListeners(); 
		scheduleServer.createSystemObjects();
	}
	public void stopServer(){
		scheduleServer.releaseProcesses(); 
		scheduleServer.destory(); 
		scheduleServer.destroySystemObjects(); 
		scheduleServer.destoryListeners(); 
		scheduleServer.destoryContext(); 
		scheduleServer.shutdown();
	}
}

总结

在什么情况下使用门面模式

  • 为复杂的子系统提供了一个简单的统一接口,但不会向客户端屏蔽掉子系统的接口,当客户端需要定制化过程时,可以略过门面,自己定制化。
  • 引入门面,可以解耦客户度和子系统,使子系统独立和可移植。
  • 如果有多个子系统,为每个子系统提供Facade , 可以解耦多系统之间的调用。

你可能感兴趣的:(设计模式)