一、实验内容
利用外观模式实现文件加密功能。实例说明:某系统需要实现一个文件加密模块,加密流程分为三个操作,分别是读取文件,加密,保存加密之后的文件。保存文件和读取文件使用流来实现,这三个操作相对独立,其业务代码封装在三个不同的类中。现需要提供一个统一的加密外观类,用户可以直接使用该加密外观类完成文件的读取,加密和保存三个操作,而不需要与每一个类进行交互,使用外观设计模式设计该加密模块。实现类图进行代码,并编写客户端,测试运行代码。
二.设计类图

三、类具体代码(要求有相关注释)
#include<iostream>
#include<string>
#include<sstream>
#include<fstream>
#include<vector>
using namespace std;
class FileReader
{
public:
//读取文件内容
string read(string fileNameSrc)
{
cout << "读取文件获取明文。" << endl;
std::fstream myfile;
//打开文件,并将文件内容写到文件流对象myfile中
myfile.open(fileNameSrc, ifstream::in);
//创建一个输入输出流对象
stringstream sBuf;
//判断打开文件是否成功,如果成功将文件内容写入到sbuf中,并返回
if (myfile.is_open())
{
char ch;
while (sBuf && myfile.get(ch))
{
sBuf.put(ch);
}
}
else
{
cout << "打开文件失败" << endl;
}
//cout << sBuf.str() << endl;
return sBuf.str();
}
};
class CipherMachine
{
public:
string encrypt(string plainText) {
cout << "数据加密,将明文转换为密文" << endl;
string es = "";
//这是一个简单的加密算法,将文件内容每个字符都除以7,变成密文
for (int i = 0; i < plainText.length(); i++) {
char c = (char)(plainText[i] % 7);
es += c;
}
return es;
}
};
class FileWriter
{
public:
void write(string encryptStr, string fileNameDes)
{
cout << "保存密文,写入文件" << endl;
//创建一个输出流对象,并将fileNameDes内容写入到到输出流当中
ofstream myfile;
myfile.open(fileNameDes, ifstream::out);
//如果打开文件成功,就将eccryptStr内容写到fileNameDes中
if (myfile.is_open())
{
myfile << encryptStr;
myfile.close();
}
else
{
cout << "打开或创建" + fileNameDes + "文件失败" << endl;
}
}
};
class Encryptfacade {
private:
FileReader reader;
CipherMachine cipher;
FileWriter writer;
public:
Encryptfacade() {
reader = FileReader();
cipher = CipherMachine();
writer = FileWriter();
}
void fileEncrypt(string fileNameSrc, string fileNameDes) {
//读取源文件到plainStr中
string plainStr = reader.read(fileNameSrc);
//将plainStr中的内容进行加密,并赋给encryptStr
string encryptStr = cipher.encrypt(plainStr);
//将encryptStr中的内容写到文件fileNameDes中去
writer.write(encryptStr, fileNameDes);
}
};
int main()
{
Encryptfacade ef = Encryptfacade();
ef.fileEncrypt("1.txt","加密文件.txt");
return 0;
}
四.运行结果截图
五.设计模式分析总结
(1)在外观模式中,外部与一个子系统的通信必殒通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观被式定义了一个高层接口,这个接口使得这一子系统更加容易使用,外观模式又称为门面模式,它是一种对象结构型模式。
(2)外观模式包含两个角色,外观角色是在客户端直接调用的角色,在外观角色中可以知道相关的(一个或者多个)子系统的功能和责任,它将所有从客户端发来的请求委派到相应的子系统去,传递给相应的子系统对象处理;在软件系统中可以同时有一个或者多个子系统角色,每一个子系统可以不是一个单独的类,而是一个类的集合,它实现子系统的功能。
(3)外观模式要求一个子系统的外部与其内部的通信通过一个统一的外观对象进行,外观类将客户端与子系统的内部复杂性分隔开,使得客户端只需要与外观对象打交道,而不需要与子系统内部的很多对象打交道。
(4)外观模式主要优点在于对客户屏子系统组件,减少了客户处理的对象数目并使得子系统使用起来更加容易,它实现了子系统与客户之间的松耦合关系,并降低了大型软件系统中的编译依赖性,简化了系统在不同平台之间的移植过程;其缺点在于不能很好地限制客户使用子系统类,而且在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。
(5)外观模式适用情况包括:要为一个复杂子系统提供一个简单接口;客户程序与多个子系统之间存在很大的依赖性;在层次化结构中,需要定义系统中每一层的入口,使得层与层之间不直接产生联系。