外观模式
概述
外观模式:为子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
外观模式又称为门面模式,是一种对象结构型模式。通过引入一个新的外观角色可以降低原有系统的复杂度,同时降低客户类与子系统的耦合度。在外观模式中,一个子系统的外部与其内部的通信通过一个统一的外观类进行,外观类将客户类与子系统的内部复杂性分隔开,使得客户类只需要与外观角色打交道,而不需要与子系统内部的很多对象打交道。
类似于,自己泡茶和茶馆喝茶的区别。自己泡茶需要自行准备茶叶、茶具和开水,而茶馆喝茶只需要跟服务员交谈,泡茶由服务员完成。此时服务员充当外观模式的外观类。
结构
外观模式包含以下两个角色:
- Facade(外观角色):在客户端可以调用它的方法,在外观角色中可以知道相关的(一个或者多个)子系统的功能和责任;在正常情况下,它将所有从客户端发来的请求委派到相应的子系统去,传递给相应的子系统对象处理。
- SubSystem(子系统角色):在软件系统中可以有一个或者多个子系统角色,每一个子系统可以不是一个单独的类,而是一个类的集合,它实现子系统的功能;每一个子系统都可以被客户端直接调用,或者被外观角色调用,它处理由外观类传过来的请求;子系统并不知道外观的存在,对于子系统而言,外观角色仅仅是另外一个客户端而已。
结构实现
子系统类:通常是一些业务类,实现了一些具体的、独立的业务功能。
public class SubSystemA{
public void methodA(){
//业务实现代码
}
}
public class SubSystemB{
public void methodB(){
//业务实现代码
}
}
public class SubSystemC{
public void methodC(){
//业务实现代码
}
}
外观类:
public class Facade{
private SubSystemA obj1 = new SubSystemA();
private SubSystemB obj2 = new SubSystemB();
private SubSystemC obj3 = new SubSystemC();
public void method(){
obj1.methodA();
obj2.methodB();
obj3.methodC();
}
}
客户端类:
public class Client{
public static void main(String args[]){
Facade facades = new Facade();
facade.method();
}
}
练习
某软件公司要开发一个可应用于多个软件的文件加密模块,该模块可以对文件中的数据进行加密并将加密之后的数据存储在一个新文件中,具体的流程包括3个部分,分别是读取源文件、加密、保存加密之后的文件,其中,读取文件和保存文件使用流来实现,加密操作通过求模运算实现。这3个操作相对独立,为了实现代码的独立重用,让设计更符合单一职责原则,这3个操作的业务代码封装在3个不同的类中。
现使用外观模式设计该文件加密模块。
源代码
FileReader.java:文件读取类,充当子系统类
package facade;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class FileReader {
public String read(String fileNameSrc) {
System.out.print("读取文件,获取明文:");
StringBuffer sb = new StringBuffer();
try {
FileInputStream inFS = new