设计模式-外观模式的应用
外观模式的应用
某软件公司要开发一个可应用于多个软件的文件加密模块,该模块可以对文件中的数据进行加密并将加密之后的数据存储在一个新文件中,具体的流程包括3个部分,分别是读取源文件、加密、保存加密之后的文件,其中,读取文件和保存文件使用流来实现,加密操作通过求模运算实现。这3个操作相对独立,为了实现代码的独立重用,让设计更符合单一职责原则,这3个操作的业务代码封装在3个不同的类中。
现使用外观模式设计该文件加密模块。
用JAVA语言实现 。绘制该模式的UML图。
【模式UML图】
【模式代码(JAVA语言实现)】
// FileReader.java:
package sdp.sy_7.facadepattern;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class FileReader {
public String read(String fileNameSrc) {
System.out.print("读取文件,获取明文:");
StringBuffer stringBuffer = new StringBuffer();
try {
FileInputStream fileInputStream = new FileInputStream(fileNameSrc);
int data;
while((data = fileInputStream.read()) != -1) {
stringBuffer = stringBuffer.append((char)data);
}
fileInputStream.close();
System.out.println(stringBuffer.toString());
} catch (FileNotFoundException e) {
System.out.println("文件不存在!");
} catch (IOException e) {
System.out.println("文件操作错误!");
}
return stringBuffer.toString();
}
}
// FileWriter.java:
package sdp.sy_7.facadepattern;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileWriter {
public void Write(String encryptText, String fileNameDes) {
System.out.println("保存密文,写入文件。");
try {
FileOutputStream fileOutputStream = new FileOutputStream(fileNameDes);
fileOutputStream.write(encryptText.getBytes());
fileOutputStream.close();
} catch (FileNotFoundException e) {
System.out.println("文件不存在!");
} catch (IOException e) {
System.out.println("文件操作错误!");
}
}
}
// CipherMachine.java:
package sdp.sy_7.facadepattern;
public class CipherMachine {
public String Encrypt(String plainText) {
System.out.println("数据加密,将明文转换为密文:");
String es = "";
for(int i = 0; i<plainText.length(); i++) {
String c = String.valueOf(plainText.charAt(i)%7);
es += c;
}
System.out.println(es);;
return es;
}
}
// Client.java:
package sdp.sy_7.facadepattern;
public class Client {
public static void main(String[] args) {
EncryptFacade encryptFacade = new EncryptFacade();
encryptFacade.FileEncrypt("src.txt", "des.txt");
}
}
Hello World!
233364362325
【运行截图】
外观模式的适用性如下:
- 当要为访问一系列复杂的子系统提供一个简单入口时可以使用外观模式。
- 客户端程序与多个子系统之间存在很大的依赖性。引入外观类可以将子系统与客户端解耦,从而提高子系统的独立性和可移植性。
- 在层次化结构中,可以使用外观模式定义系统中每一层的入口,层与层之间不直接产生联系,而通过外观类建立联系,降低层之间的耦合度。
顺便提一下:我这里是使用eclipse进行编写代码和运行代码的,src.txt是新建在当前工程的目录下的,即与eclipse中工程的src文件夹在同一级目录,des.txt建不建都可以,不建的话运行代码后会自动生成,位置会跟src.txt 相同。主要是要注意一下src.txt文件新建的位置,要不然会运行失败,报错:找不到文件。