实验名称 外观模式的应用 日期 2018年 04 月1 日
一、实验目的:
1) 掌握外观模式(Facade)的特点
2) 分析具体问题,使用外观模式进行设计。
某软件公司要开发一个可应用于多个软件的文件加密模块,该模块可以对文件中的数据进行加密并将加密之后的数据存储在一个新文件中,具体的流程包括3个部分,分别是读取源文件、加密、保存加密之后的文件,其中,读取文件和保存文件使用流来实现,加密操作通过求模运算实现。这3个操作相对独立,为了实现代码的独立重用,让设计更符合单一职责原则,这3个操作的业务代码封装在3个不同的类中。
现使用外观模式设计该文件加密模块。
用JAVA语言实现 (或C#控制台应用程序实现)。绘制该模式的UML图。
二、实验环境:
三、实验内容:
【模式UML图】
【模式代码(JAVA语言实现)】
public class EncryptTest {
public static void main(String[] args) {
EncryptFacade encryptFacade = new EncryptFacade();
encryptFacade.FileEncrypt("D:\\mingwen.txt", "D:\\miwen.txt");
}
}
public class EncryptFacade {
private FileReader fileReader;
private CipherMachine cipherMachine;
private FileWriter fileWriter;
public EncryptFacade(){
fileReader = new FileReader();
cipherMachine = new CipherMachine();
fileWriter = new FileWriter();
}
public void FileEncrypt(String fileNameSrc,String fileNameDes){
String plainString = fileReader.Read(fileNameSrc);
String encryptString = cipherMachine.Encrypt(plainString);
fileWriter.Write(encryptString, fileNameDes);
}
}
public class FileReader {
public String Read(String fileName){
System.out.println("获取文件,读取明文");
StringBuilder stringBuilder = new StringBuilder();
File file = new File(fileName);
try {
FileInputStream fileInputStream = new FileInputStream(file);
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
int data;
while((data = bufferedInputStream.read()) != -1){
stringBuilder = stringBuilder.append((char)data);
}
bufferedInputStream.close();
fileInputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
System.out.println(stringBuilder.toString());
return stringBuilder.toString();
}
}
public class FileWriter {
public void Write(String encryptText,String fileName){
File file = new File(fileName);
try {
FileOutputStream fileOutputStream = new FileOutputStream(file);
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
byte[] b = encryptText.getBytes();
bufferedOutputStream.write(b);
bufferedOutputStream.close();
fileOutputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
}
}
public class CipherMachine {
public String Encrypt(String mingwen){
System.out.println("明文转化成密文");
String e = "";
char[] c = mingwen.toCharArray();
for(char c1 : c){
e = e + (int)c1 % 7;
}
System.out.println(e);
return new String(e);
}
}
【运行截图】
四、心得体会:
通过本次实验,学会了使用外观模式。外观模式的适用性如下:
客户端不需要知道系统内部的复杂联系,整个系统只需提供一个"接待员"即可。
定义系统的入口。