<<大话设计模式>>之外观模式
2016-05-04 09:30
483 查看
(部分内容有参考之嫌疑)
外观模式:
为子系统的各个类提供了一个简明一致的界面,它隐藏了子系统的复杂性,使得子系统更加容易被使用。
子系统(提供相关特征而紧密联系的一组类)
比如之前有人提过的例子,医院。
在医院这个子系统中,一个客户要去医院看病,需要经过挂号,门诊,开药,取药等过程。
那么多个客户去看病,在医院这个子系统中看来,会显得十分的麻烦。而解决的办法,就是提供一个接待员,这个接待员负责和医院的部门打交道,而你只负责把请求交给接待员。
模拟一个人去看病:
四个Module,代表一个医院的子系统
为上面的子系统提供一个简明的接口,将客户与子系统分离。
客户端只需要考虑由外观提供的简易接口
使用外观模式需要注意的点:
①不要在外观模式中增加额外的功能
②不能在外观模式中返回子系统的组件给客户,如果这样的话,应用不能从外观模式上获得最大的好处
③外观要提供高层次的接口,比如在医院这个例子中,高层次指的是和客户(病人)有关的内容。不需要在接口知道,和病人无关的子系统细节,比如,负责挂号的阿姨哪个漂亮,医生的开药处方是否潦草等。(当然这些细节,完全可以在子系统中各个类中私有。)
外观模式:
为子系统的各个类提供了一个简明一致的界面,它隐藏了子系统的复杂性,使得子系统更加容易被使用。
子系统(提供相关特征而紧密联系的一组类)
比如之前有人提过的例子,医院。
在医院这个子系统中,一个客户要去医院看病,需要经过挂号,门诊,开药,取药等过程。
那么多个客户去看病,在医院这个子系统中看来,会显得十分的麻烦。而解决的办法,就是提供一个接待员,这个接待员负责和医院的部门打交道,而你只负责把请求交给接待员。
模拟一个人去看病:
四个Module,代表一个医院的子系统
public class SubSystem1 { public void guahao(){ System.out.println("负责挂号"); } }
public class SubSystem2 { public void menzhen(){ System.out.println("负责门诊"); } }
public class SubSystem3 { public void kaiyao(){ System.out.println("负责开药"); } }
public class SubSystem4 { public void quyao(){ System.out.println("负责取药"); } }
为上面的子系统提供一个简明的接口,将客户与子系统分离。
public class Facade { private SubSystem1 sub1; private SubSystem2 sub2; private SubSystem3 sub3; private SubSystem4 sub4; public Facade(){ sub1=new SubSystem1(); sub2=new SubSystem2(); sub3=new SubSystem3(); sub4=new SubSystem4(); } public void kaibing(){ sub1.guahao(); sub2.menzhen(); sub3.kaiyao(); sub4.quyao(); } }
客户端只需要考虑由外观提供的简易接口
public class Client { public static void main(String[] args) { Facade facade=new Facade(); facade.kaibing(); } }
使用外观模式需要注意的点:
①不要在外观模式中增加额外的功能
②不能在外观模式中返回子系统的组件给客户,如果这样的话,应用不能从外观模式上获得最大的好处
③外观要提供高层次的接口,比如在医院这个例子中,高层次指的是和客户(病人)有关的内容。不需要在接口知道,和病人无关的子系统细节,比如,负责挂号的阿姨哪个漂亮,医生的开药处方是否潦草等。(当然这些细节,完全可以在子系统中各个类中私有。)
相关文章推荐
- 非常好的Java反射例子
- Twitter是如何做到每秒处理3000张图片的?
- require()函数
- oracle修改bdump日志存放路径
- UIImage的两种初始化方式
- mysql关于or的索引问题
- VS2010修改帮助文档路径
- 实现collectionViewCell的移动(长按或者直接拖拽)
- [C#.NET][Entity Framework] Code First - Reverse engineering from an existing database at EF6.1.0
- Android 6.0运行时权限请求示例
- java概述
- MySQL中in(常量列表)的执行计划
- rk3126 多分区实现,简单概述
- POJ 1631 Bridging signals DP(最长上升子序列)
- Linux磁盘扩容LVM
- IntelliJ IDEA激活
- Markdown与Bootstrap相结合实现图片自适应属性
- Win8.1系统程序运行发生冲突提示"APPCRASH”错误的故障原因及解决方法
- java如何获取SQL查询结果集中的行数和列数
- recv()和send()函数