设计模式——外观模式
2016-07-14 10:03
246 查看
为子系统中的一组接口提供一个一致的界面,定义一个高层接口,这个接口使得这一子系统更加容易使用。
角色
门面(facade):客户端可以调用这个角色的方法,此角色知道相关子系统的功能和责任。在正常情况下,本角色会将所有客户端发来的请求委派到响应的子系统去。
子系统(subSystem):可以同时有一个或多个子系统,每一个子系统都不是一个单独的类,而是一个类的集合,每一个子系统都可以被单独调用,或者被门面角色调用。子系统并不知道门面的存在,门面仅仅是另外一个客户端。
优点
1、引入外观模式,是客户对子系统的使用变得简单了,减少了与子系统的关联对象,实现了子系统与客户之间
的松耦合关系。
2、只是提供了一个访问子系统的统一入口,并不影响用户直接使用子系统类
3、降低了大型软件系统中的编译依赖性,并简化了系统在不同平台之间的移植过程
缺点
1、不能很好地限制客户使用子系统类,如果对客户访问子系统类做太多的限制则减少了可变性和灵活性
2、在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”
类图
代码
package com.sun.apprance.gj;
/**
* 子系统Alarm
* @author work
*
*/
public class Alarm {
public void activate() {
System.out.println("alarm activate !");
}
public void deactivate() {
System.out.println("alarm deactivate !");
}
}
角色
门面(facade):客户端可以调用这个角色的方法,此角色知道相关子系统的功能和责任。在正常情况下,本角色会将所有客户端发来的请求委派到响应的子系统去。
子系统(subSystem):可以同时有一个或多个子系统,每一个子系统都不是一个单独的类,而是一个类的集合,每一个子系统都可以被单独调用,或者被门面角色调用。子系统并不知道门面的存在,门面仅仅是另外一个客户端。
优点
1、引入外观模式,是客户对子系统的使用变得简单了,减少了与子系统的关联对象,实现了子系统与客户之间
的松耦合关系。
2、只是提供了一个访问子系统的统一入口,并不影响用户直接使用子系统类
3、降低了大型软件系统中的编译依赖性,并简化了系统在不同平台之间的移植过程
缺点
1、不能很好地限制客户使用子系统类,如果对客户访问子系统类做太多的限制则减少了可变性和灵活性
2、在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”
类图
代码
package com.sun.apprance.gj;
/**
* 子系统Alarm
* @author work
*
*/
public class Alarm {
public void activate() {
System.out.println("alarm activate !");
}
public void deactivate() {
System.out.println("alarm deactivate !");
}
}
package com.sun.apprance.gj; /** * 子系统Camera * @author work * */ public class Camera { public void turnOn() { System.out.println("camera turn on"); } public void turnOff() { System.out.println("camera turn off"); } }
package com.sun.apprance.gj; /** * 门面 * @author work * */ public class Facede { private Alarm alarm = new Alarm(); private Camera camera = new Camera(); private Light light = new Light(); public void activate() { camera.turnOn(); light.turnOn(); alarm.activate(); } public void deactivate() { camera.turnOff(); light.turnOff(); alarm.deactivate(); } public static void main(String[] args) { Facede f = new Facede(); f.activate(); f.deactivate(); } }
package com.sun.apprance.gj; /** * 子系统Light * @author work * */ public class Light { public void turnOn() { System.out.println("light turn on"); } public void turnOff() { System.out.println("light turn off"); } }
package com.sun.apprance.gj; /** * 门面 * @author work * */ public class Facede { private Alarm alarm = new Alarm(); private Camera camera = new Camera(); private Light light = new Light(); public void activate() { camera.turnOn(); light.turnOn(); alarm.activate(); } public void deactivate() { camera.turnOff(); light.turnOff(); alarm.deactivate(); } public static void main(String[] args) { Facede f = new Facede(); f.activate(); f.deactivate(); } }
相关文章推荐
- Matlab和C++混合编程
- 青年图摘0714!唯美背后
- xtrabackup原理1
- 35W行数据的文本文件,每500行添加4个换行符。代码实现思路
- 设计模式总结
- java自学篇之class
- hiho 1015 KMP算法
- iOS中使用blend改变图片颜色
- ucosii之任务的同步与通信
- jQuery实现公告新闻自动滚屏效果实例代码
- pta--树的同构
- HDU 3501 Calculation 2(容斥原理、求[1,n - 1]中和n不互素的数字之和)
- AJAX知识
- JAVA环境变量配置
- Linux常用的命令
- PAT 团体程序设计天梯赛-练习集 L1-018. 大笨钟
- git同步报错
- eclipse/intellij idea 远程调试hadoop 2.6.0
- java gui 多线程,界面假死、僵死问题
- Qt:Exception at 0xeefde9, code:0x0000005: read access violation at: 0x0, flags = 0x0(first chance)