外观模式
外观模式也被称为门面模式。当我们开发android的时候,无论是做SDK还是封装API,大多数都会用到外观模式,它通过一个外观类使得整个系统的结构只有一个统一的高层接口,降低用户的使用成本
- 定义:要求一个子系统的外部与内部的通信必须通过一个统一的对象进行。此模式提供一个高层的接口,使得子系统更易于使用
- 外观模式有如下角色:
- Facade:外观类,知道哪些子系统类负责处理请求,将客户端的请求代理给适当的子系统对象
- Subsystem:子系统类,可以有一个或者多个子系统。实现子系统的功能,处理外观类指派的任务,注意子系统类不含有外观类的引用
- 外观模式的简单实现:
- 子系统类
public class JingMai { public void jingmai(){ System.out.println("开启经脉"); } } public class NeiGong { public void JiuYang(){ System.out.println("使用内功九阳神功"); } public void Qiankun(){ System.out.println("使用内功乾坤大挪移"); } } public class ZhaoShi { public void TaiJiQuan(){ System.out.println("使用招式太极拳"); } public void QiShangQuan(){ System.out.println("使用招式七伤拳"); } public void ShengHuo(){ System.out.println("使用招式圣火令"); } }
- 子系统类
-
- 外观类
public class ZhangwuJI { private JingMai jingMai; private NeiGong neiGong; private ZhaoShi zhaoShi; public ZhangwuJI() { jingMai = new JingMai(); neiGong = new NeiGong(); zhaoShi = new ZhaoShi(); } /** * 使用乾坤大挪移 */ public void QianKun(){ jingMai.jingmai(); neiGong.Qiankun(); } public void Qishangquan(){ jingMai.jingmai(); neiGong.JiuYang(); zhaoShi.QiShangQuan(); } }
- 外观类
-
- 客户端调用
public class FacadateDemo { public static void main(String[] args){ System.out.println("==============================================="); ZhangwuJI zhangwuJI = new ZhangwuJI(); zhangwuJI.QianKun(); System.out.println("==============================================="); zhangwuJI.Qishangquan(); } }
- 客户端调用
- 使用场景
- 构建一个有层次结构的系统时,使用外观模式定义子系统中每层的入口点,如果子系统之间是相互依赖的,则可以让其通过外观接口进行通信,减少子系统之间的依赖关系
- 子系统往往因为不断地重构演化而变得越来越复杂,大多数的模式使用时也会产生很小很小的类,这给外部调用他们的用户程序带来了使用上的困难。我们可以使用外观类提供一个简单的接口,对外隐藏子系统的具体实现并隔离变化
- 当维护一个遗留的大型系统时,可能这个系统已经非常难以维护和拓展;但因为它含有重要的功能,所以新的需求必须依赖于它,这时可以使用外观类,为设计粗糙或者复杂的遗留代码提供一个简单的接口,让新系统和外观类交互,而外观类负责与遗留的代码进行交互
- 优点
- 减少系统的相互依赖,所有的依赖都是对外观类的依赖,与子系统无关
- 对用户隐藏了子系统的具体实现,减少用户对子系统的耦合。这样即使子系统的具体发生了变化,用户不会感知到
- 加强了安全性,子系统中的方法如果不在外观类中开通就无法访问到子系统中的方法
- 缺点
- 不符合开放封闭原则,如果业务出现变更,则可能要修改外观类,继承重写都不合适
Dana.Lee
To:Dana_Lee1016@126.com