外观模式:客户端与子系统类之间的通信是通过一个外观角色进行的,外观角色为客户端和子系统提供了统一的接口,方便客户端的使用和子系统的拓展。
下面是相关实例:
现在需要设计一个文件加密的系统,该系统包含三个部分,第一部分是读取文件中的明文,第二是给明文进行加密,第三是将加密的信息存放到加密的文件中。
以上的描述对应着三个类:
FileReader:用于读取明文的文件
EncryptFile:用于加密文件
FileWriter:用于将加密后的文件写入到加密后的文件中
很显然客户端要实现以上功能的话不得不使用以上三个类,这样的话如果想重用该系统的话就会出现大量的代码重复。另外在更替的加密算法后不得不修改客户端中所有的代码,不利于系统的维护。
解决上述问题的办法;
在客户端和业务类之间增加外观类,解决客户端和业务类之间过分的耦合。将外观类抽象出来的话,就可以是系统扩展性更好了,这样的话就可以使得客户端可以针对抽象编程,简化了用户的操作。并且在更替加密算法后也不用去修改源码,有利于系统的维护。
下面是相关实现:
//抽象的外观类
public abstract class AbstractFacade {
/**
* @param fileName:表示明文文件名称
* @param encryptFileName:表示加密后的文件名称
*/
public abstract void encryptFile(String fileName,StringencryptFileName);
}
//具体的外观类
public class Facade extendsAbstractFacade
{
private FileReader reader;
private EncryptFile encryptFile;
private FileWriter writer;
//初始化业务逻辑类
public Facade()
{
reader = newFileReader();
encryptFile = newEncryptFile();
writer = newFileWriter();
}
public void encryptFile(String fileName, StringencryptFileName)
{
//读取文件
String publicMessage = reader.readFile(fileName);
//对读取的明文信息进行加密
String privateMessage = encryptFile.encryptFile(publicMessage);
//将加密后的信息写入文件中
writer.write2File(privateMessage, encryptFileName);
}
}
//业务类1
public class FileReader {
public String readFile(String fileName)
{
System.out.println("读取文件****"+fileName+"****中的明文信息.");
return "需要加密的信息...";
}
}
//业务类2
public class EncryptFile {
public String encryptFile(String publicMessage)
{
System.out.println("第一种加密的算法实现文件的加密...");
return "加密后的信息...";
}
}
//业务类三
public class FileWriter {
public void write2File(String encryptString,StringencryptFileName)
{
System.out.println("将加密后的信息****"+encryptString+"****写入加密后的文件****"+encryptFileName+"****中.");
}
}
//客户端
public class Client
{
public static void main(String[] args)
{
//这里完全可以通过配置文件将外观类的具体实现利用反射技术进行动态实例化,这样就
//可以扩展系统的同时不需要修改源代码
AbstractFacade facade = new Facade();
facade.encryptFile("要加密的文件.txt", "加密的文件_encrypt.txt");
}
}
运行结果:
读取文件****要加密的文件.txt****中的明文信息.
第一种加密的算法实现文件的加密...
将加密后的信息****加密后的信息...****写入加密后的文件****加密的文件_encrypt.txt****中.