一.内容说明
某系统需要提供一个文件加密模块,加密流程包括三个操作,分别是读取源文件,加密,保存加密之后的文件。读取文件和保存文件使用流来实现,这三个操作相对独立,其业务代码封装在三个不同的类中。现在需要提供一个统一的加密外观类,用户可以直接使用该加密外观类完成文件的读取,加密和保存三个操作,而不需要与每一个类进行交互,使用外观模式设计该加密模块。
二.设计类图
三.全部类代码
1.子系统类FileReader(读取文件类)
public class FileReader {
public String read(String fileNameSrc) {
System.out.println("读取源文件...");
return fileNameSrc;
}
}
FileReader作为子系统类,提供了读取文件方法。
2.子系统类CipherMachine(加密文件类)
public class CipherMachine {
public String encrypt(String plainText) {
System.out.println("文件加密...");
return plainText;
}
}
CipherMachine作为子系统类,提供了加密文件方法。
3.子系统类FileWriter(读取文件类)
public class FileWriter {
public void write(String encryptText,String fileNameDes) {
System.out.println("保存文件...");
}
}
FileWriter作为子系统类,提供了保存文件方法。
4.外观类EncryptFacade(统一加密类)
public class EncryptFacade {
private FileReader reader;
private CipherMachine cipher;
private FileWriter writer;
public EncryptFacade() {
reader = new FileReader();
cipher = new CipherMachine();
writer = new FileWriter();
}
public void fileEncrypt(String fileNameSrc,String fileNameDes) {
String plainStr = reader.read(fileNameSrc);
String encryptStr = cipher.encrypt(plainStr);
writer.write(encryptStr, fileNameDes);
}
}
EncryptFacade是外观类,也是整个外观模式的核心,它与子系统类之间具有关联关系,在外观类中可以调用子系统对象的方法。在EncryptFacade类的fileEncrypt()方法中分别调用了子系统类FileReader中的read()方法,子系统类CipherMachine中的encrypt()方法和子系统类FileWriter中的write方法,从而实现了对整个系统的统一控制。
5.客户端测试类Client
public class Client {
public static void main(String args[]) {
EncryptFacade ef = new EncryptFacade();
ef.fileEncrypt("D:/外观模式/1.txt","D:/外观模式/2.txt");
}
}
四.运行结果
五.分析和总结
1.整体构造:
外观模式要求一个子系统的外部与其内部的通信通过一个统一的外观对象进行,外观类将客户端与子系统的内部复杂性分隔开,使得客户端只需要与外观对象打交道。
2.优点:
(1)它对客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起来更加容易。通过引入外观模式,客户端代码将变得很简单,与之关联的对象也很少。
(2)它实现了子系统与客户端之间的松耦合关系,这使得子系统的变化不会影响到调用它的客户端,只需要调整外观类即可。
(3)一个子系统的修改对其他子系统没有任何影响,而且子系统内部变化也不会影响到外观对象。
3.缺点:
(1)不能很好地限制客户端直接使用子系统类,如果对客户端访问子系统类做太多的限制则减少了可变性和灵活性。
(2)如果设计不当,增加新的子系统可能需要修改外观类的源代码,违背了开闭原则。