外观模式——统一编程接口
2016-02-18 13:56
344 查看
(《设计模式解析与实战——何红辉,关爱民》读书笔记)
一、定义
要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式(Facade模式)提供一个高层次的接口,使得子系统更易于使用。
二、使用场景
(1)为一个复杂子系统提供一个简单接口。子系统往往因为不断演化而变得越来越复杂,甚至可能被替换掉。大多数模式使用时都会产生更多、更小的类,在这使子系统更具可重复性的同时也更容易对子系统进行定制、修改,这种易变性使得隐藏子系统的具体实现变得尤为重要。Facade可以提供一个简单统一的接口,对外隐藏子系统的具体实现、隔离变化。
(2)当你需要构建一个层次结构的子系统时,使用Facade模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,你可以让它们仅通过Facade接口进行通信,从而简化了它们之间的依赖关系。
三、简单示例
任何一个类似中央调度结构的组织都类似于外观模式。比如说手机,它集电话、照相、上网等功能于一身。
运行结果:
四、总结
外观模式是一个高频率使用的设计模式,它的精髓在于封装二字。通过一个高层次结构为用户提供统一的API入口,使得用户通过一个类型就基本能够操作整个系统,这样减少了用户的使用成本,也能够提升系统的灵活性。
优点:
(1)对客户程序隐藏子系统细节,因而减少了客户对于子系统的耦合,能够拥抱变化;
(2)外观类对子系统的接口封装,使得系统更易于使用。
缺点:
(1)外观接口类膨胀。由于子系统的接口都有外观类统一对外暴露,使得外观类的API接口较多,在一定程度上增加了用户使用成本;
(2)外观类没有遵循开闭原则,当业务出现变更时,可能需要直接修改外观类。
一、定义
要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式(Facade模式)提供一个高层次的接口,使得子系统更易于使用。
二、使用场景
(1)为一个复杂子系统提供一个简单接口。子系统往往因为不断演化而变得越来越复杂,甚至可能被替换掉。大多数模式使用时都会产生更多、更小的类,在这使子系统更具可重复性的同时也更容易对子系统进行定制、修改,这种易变性使得隐藏子系统的具体实现变得尤为重要。Facade可以提供一个简单统一的接口,对外隐藏子系统的具体实现、隔离变化。
(2)当你需要构建一个层次结构的子系统时,使用Facade模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,你可以让它们仅通过Facade接口进行通信,从而简化了它们之间的依赖关系。
三、简单示例
任何一个类似中央调度结构的组织都类似于外观模式。比如说手机,它集电话、照相、上网等功能于一身。
/** * 手机:系统对外的统一接口,系统内部系统的工作 */ public class MobilePhone { // 拨号系统 private Phone mPhone = new PhoneImpl(); // 拍照系统 private Camera mCamera = new SamsungCamera(); public void dail() { mPhone.dail(); } public void videoChat() { System.out.println("-->视频聊天接通中!"); mCamera.open(); mPhone.dail(); } public void hangup() { mPhone.hangup(); } public void take() { mCamera.open(); mCamera.take(); } public void close() { mCamera.close(); } }
/** * 拨号系统:子系统接口 */ public interface Phone { // 拨电话 public void dail(); // 挂断 public void hangup(); class PhoneImpl implements Phone { @Override public void dail() { System.out.println("打电话"); } @Override public void hangup() { System.out.println("挂断!"); } } }
/** * 拍照系统:子系统接口 */ public interface Camera { // 打开相机 public void open(); // 拍照 public void take(); // 关闭相机 public void close(); class SamsungCamera implements Camera { @Override public void open() { System.out.println("打开相机!"); } @Override public void take() { System.out.println("拍照!"); } @Override public void close() { System.out.println("关闭相机!"); } } }
package com.facade.pattern; public class Test { public static void main(String[] args) { MobilePhone phone = new MobilePhone(); // 拍照 phone.take(); System.out.println("==============="); // 视频聊天 phone.videoChat(); System.out.println("==============="); // 拨号 phone.dail(); System.out.println("==============="); // 挂断 phone.hangup(); } }
运行结果:
四、总结
外观模式是一个高频率使用的设计模式,它的精髓在于封装二字。通过一个高层次结构为用户提供统一的API入口,使得用户通过一个类型就基本能够操作整个系统,这样减少了用户的使用成本,也能够提升系统的灵活性。
优点:
(1)对客户程序隐藏子系统细节,因而减少了客户对于子系统的耦合,能够拥抱变化;
(2)外观类对子系统的接口封装,使得系统更易于使用。
缺点:
(1)外观接口类膨胀。由于子系统的接口都有外观类统一对外暴露,使得外观类的API接口较多,在一定程度上增加了用户使用成本;
(2)外观类没有遵循开闭原则,当业务出现变更时,可能需要直接修改外观类。
相关文章推荐
- Spring管理事务默认回滚的异常是什么?
- Java线程(十):CAS
- 【python】编程语言入门经典100例--3
- Java中通过UDP协议发送和接受数据
- Java中通过UDP协议发送和接受数据
- python2.7爬虫实战(房地产信息抓取)
- c++变量的作用域、生存期和可见性
- phpExcel常用方法详解【附有php导出excel加超级链接】
- 【python】编程语言入门经典100例--2
- java判断字符串包含某个字符段
- Java开发中的23种设计模式详解(转)
- Java线程(九):Condition-线程通信更高效的方式
- 2、修改MyEclipse中生成的模板servlet的方法
- 关于c++虚函数及访问基类私有函数的实践及一些疑问
- PHP array_multisort() 函数详解 及 二维数组排序(模拟数据表记录按字段排序)
- django创建数据表同步
- 一些C#实用的方法汇总
- [翻译]Go语言调度器
- Java线程(八):锁对象Lock-同步问题更完美的处理方式
- vb计算溢出问题