您的位置:首页 > 其它

外观模式(门面模式)

2014-05-05 18:59 260 查看
外观模式的一个常见的设计目标是使客户与子系统之间的通信和相互依赖关系达到最小。关键在于,引入一个Facade角色,作为系统的访问提供了一个简单而单一的入口。

以下是外观模式的结构图:



这里的子系统是一个广义的概念,他可以是一个类,一个功能模块,系统的一个组成或一个完整的系统。

外观模式的主要目的在于降低系统的复杂程度,并给客户带来极大的方便。

现在假设有以下三个类:

class FileReader{
public String read(String filename){
System.out.println("读取文件,获取明文");
StringBuffer sb = new StringBuffer();
try {
FileInputStream fis = new FileInputStream(filename);
int i = 0;
while((i = fis.read()) != -1){
sb.append((char)i);
}
fis.close();
System.out.println(sb.toString());
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return sb.toString();
}
}
//数据加密
class CipherMachine{
public String encrpt(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;
}
}
class FileWriter{
public void write(String data,String filename){
System.out.println("保存密文,写入文件");
try {
FileOutputStream fos = new FileOutputStream(filename);
fos.write(data.getBytes());
fos.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}


三个类有独立的功能,这样的话,这三个类就有较好的可重用性了。但是,其他多个功能模块可能常常需要同时用到这三个类,读文件,加密,写文件,这样就使得系统的类之间的耦合度较大。那么,可以引入外观类以降低类之间的联系:

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 plainText = reader.read(fileNameSrc);
String es = cipher.encrpt(plainText);
writer.write(es, fileNameDes);
}
}


这样,在需要读文件,加密,写文件的地方就不需要引用三个类了,而只需要一个外观类即可。如:

public static void main(String[] args) {
// TODO Auto-generated method stub
EncryptFacade ef = new EncryptFacade();
ef.fileEncrypt("...","...");
}


这样一来,就降低了系统的复杂性。

另外补充说明的是,tomcat在对Request类使用了外观模式,其目的是提高系统的安全性。这个详细在后面tomcat专栏再说吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: