外观模式(门面模式)
2014-05-05 18:59
260 查看
外观模式的一个常见的设计目标是使客户与子系统之间的通信和相互依赖关系达到最小。关键在于,引入一个Facade角色,作为系统的访问提供了一个简单而单一的入口。
以下是外观模式的结构图:
这里的子系统是一个广义的概念,他可以是一个类,一个功能模块,系统的一个组成或一个完整的系统。
外观模式的主要目的在于降低系统的复杂程度,并给客户带来极大的方便。
现在假设有以下三个类:
三个类有独立的功能,这样的话,这三个类就有较好的可重用性了。但是,其他多个功能模块可能常常需要同时用到这三个类,读文件,加密,写文件,这样就使得系统的类之间的耦合度较大。那么,可以引入外观类以降低类之间的联系:
这样,在需要读文件,加密,写文件的地方就不需要引用三个类了,而只需要一个外观类即可。如:
这样一来,就降低了系统的复杂性。
另外补充说明的是,tomcat在对Request类使用了外观模式,其目的是提高系统的安全性。这个详细在后面tomcat专栏再说吧。
以下是外观模式的结构图:
这里的子系统是一个广义的概念,他可以是一个类,一个功能模块,系统的一个组成或一个完整的系统。
外观模式的主要目的在于降低系统的复杂程度,并给客户带来极大的方便。
现在假设有以下三个类:
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专栏再说吧。
相关文章推荐
- 线性表-链表队列
- ORACLE SDO_GEOMETRY 空间数据创建查询
- iOS SQL数据库操作
- 转载和积累系列 - TCP协议疑难杂症全景解析
- Set Definition-----单调队列
- [WinAPI] 串口1-创建[包括: 打不开串口]
- Hadoop-2、Mapred初试
- vs2010 无法连接到asp.net development server
- 阅读xtrabackup代码的一点笔记
- 百度天气预报API的使用(java版本)
- hadoop优质链接
- TextView常用属性设置
- SGU Ice-cream Tycoon 线段树+离散化
- Android通过Runtime.getRuntime().exec实现Ping和Traceroute命令时readLine阻塞问题解决
- 我看移动互联网:所谓“屏占比”皆是噱头
- 发现一个很好的图片占位工具网。placehold.it
- python threading 学习笔记
- wsdl 学习
- matlab 精华
- JDBC获取Mysql自动增长字段代码