基本概念
Facade的概念
为子系统中的一组接口提供一个统一接口。Facade模式定义了一个更高层的接口,使子系统更加容易使用。
- 我们需要以一种比原有方式更简单直接的办法与系统交互,对于讨论的复杂系统我们只有针对性地使用它的一个子集
- 因为Facade模式可以封装多个子系统,可以减少客户必须处理的对象的数量
- 要求一个子系统的外部与内部的通信必须通过一个统一的对象进行。也就是说Facade对象是外界对于子系统的唯一通道,可以用来整合内部杂乱无章的子系统,不管是否败絮其中,都能做到金玉其外
Facade模式的角色分工
- Facade门面对象:
- 此角色知晓子系统的所有功能和责任。
- 一般情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去,也就是该角色没有实际的业务逻辑,只是一个委托类。
- 门面对象一般不参与子系统内的业务逻辑的实现。(只提供一个访问子系统的一个路径而已)
- 作为一个对外的接口,在系统投入运行后,它是不应该被修改的,能够隐藏和封装子系统。
封装子系统的意义:
- 跟踪系统的使用情况:通过强制所有对系统的访问都必须经过Facade,可以很容易地监视系统的使用情况
- 改换系统:未来可能需要改换系统。通过将原系统作为Facade类的一个私有成员,可以最省力地切换到新系统
- 是一个类的集合,但彼此之间可以相互独立,系统之间不存在相互依赖
- 不知道门面对象的存在。
例讲Facade
比如我们平时在使用电脑时,桌面上的文件的快捷方式(或者是一个执行文件),我们需要做的操作只是打开和关闭,通常情况下完全不需要考虑用什么打开啊,设置什么参数啊,关闭的时候应该如何销毁资源才能保证程序的数据能够不造成损失….这个可执行文件就可以看做是一个门面。因为它极大地简化了我们的操作,而且我们可以完全忽略和子系统之间的交互,而简单地认为我是在和一个完整的系统进行交互。
下面提供一个打开文件操作的实现来说明一下,门面模式到底是个什么样:
- Sub Systems:
class OpenWord{
boolean isOpen;
String name = "Viewer";
OpenWord(){
isOpen = false;
}
void open(){
System.out.println("The " + name + " is opening....");
isOpen = true;
}
void stop(){
System.out.println("The " + name + " is closing....");
isOpen = false;
}
}
class PrepareFileSystem{
boolean isOpen;
String name = "FileSystem";
PrepareFileSystem(){
isOpen = false;
}
void open1(){
System.out.println("The " + name + " is opening....");
isOpen = true;
}
void stop1(){
System.out.println("The " + name + " is closing....");
isOpen = false;
}
}
class OperateFile{
void showFile ( String name ){
System.out.println("Show the content of the file: " + name);
}
}
上述都是为了实现Facade,所以不用太在意,当作提供功能的接口类即可。
- Facade门面对象
public class OpenFileFacade {
//必须是私有成员,否则会将子系统暴露给外部
private OpenWord openWord = new OpenWord();
private PrepareFileSystem prepareFileSystem = new PrepareFileSystem();
private OperateFile operateFile = new OperateFile();
//只是提供一条访问路径,不实现业务逻辑
public void openFile ( String name ){
prepareFileSystem.open1();
openWord.open();
operateFile.showFile( name );
}
public void closeFile ( String name ){
openWord.stop();
prepareFileSystem.stop1();
}
public static void main ( String [] args ){
OpenFileFacade a = new OpenFileFacade();
a.openFile("cookBook");
a.closeFile("cookBook");
}
}
Facade应用场景
- 为一个复杂的模块或子系统提供一个共外界访问的接口
- 子系统相对独立,外界对子系统的访问只要黑箱操作即可。
- 预防低水平人员带来的风险扩散(解决项目中开发人员的水平差距的问题)
- 降低了个人代码质量对整个项目的影响的风险,一般的做法是画地为牢,只能在指定的子系统中的开发,然后再提供门面接口进行访问。
- 可以针对同一套子系统实现不同的门面类,来方便不同开发者对于子系统的使用,降低接口交流的成本和风险。
Tomcat中门面模式的使用
- HttpRequest和HttpResponse都实现了自己的Facade类:
- HttpRequestFacade
- HttpResponseFacade
- 我们以HttpRequestFacade为例,通过它收集的访问都委派给了HttpRequest,通常被封装的对象都设为Private或者Protected,以防止在Facade中直接访问。
时间: 2024-11-12 02:19:27