博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【设计模式】(五)外观模式(Facade Pattern)
阅读量:2039 次
发布时间:2019-04-28

本文共 1797 字,大约阅读时间需要 5 分钟。

在现实生活中,常常存在办事较复杂的例子,如办房产证或注册一家公司,有时要同多个部门联系,这时要是有一个综合部门能解决一切手续问题就好了。

软件设计也是这样,当一个系统的功能越来越强,子系统会越来越多,客户对系统的访问也变得越来越复杂。这时如果系统内部发生改变,客户端也要跟着改变,这违背了“开闭原则”,也违背了“迪米特法则”,所以有必要为多个子系统提供一个统一的接口,从而降低系统的耦合度,这就是外观模式的目标。

1. 外观模式的介绍

外观(Facade)模式又叫作门面模式,是一种通过为多个复杂的子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不用关心内部子系统的具体细节,这样会大大降低应用程序的复杂度,提高了程序的可维护性。

在日常编码工作中,我们都在有意无意的大量使用外观模式。只要是高层模块需要调度多个子系统(2个以上的类对象),我们都会自觉地创建一个新的类封装这些子系统,提供精简的接口,让高层模块可以更加容易地间接调用这些子系统的功能。尤其是现阶段各种第三方SDK、开源类库,很大概率都会使用外观模式。

2. 外观模式的结构

3. 外观模式的实现

定义子系统对象:

package com.siyi.facadepattern;public class Obj1 {    public void SubSystem01(){        System.out.println("SubSystem01");    }}--------------------------------------------package com.siyi.facadepattern;public class Obj2 {    public void SubSystem02(){        System.out.println("SubSystem02");    }}--------------------------------------------package com.siyi.facadepattern;public class Obj3 {    public void SubSystem03(){        System.out.println("SubSystem03");    }}

定义外观对象:

 

package com.siyi.facadepattern;public class Facade {    private Obj1 obj1;    private Obj2 obj2;    private Obj3 obj3;    public Facade(){        this.obj1 = new Obj1();        this.obj2 = new Obj2();        this.obj3 = new Obj3();    }    public void method(){        this.obj1.SubSystem01();        this.obj2.SubSystem02();        this.obj3.SubSystem03();    }}

主方法:

package com.siyi.facadepattern;public class Main {    public static void main(String[] args) {        Facade facade = new Facade();        facade.method();    }}

运行结果如下:

SubSystem01SubSystem02SubSystem03

4. 外观模式的优缺点

优点:

  1. 降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户类。
  2. 对客户屏蔽了子系统组件,减少了客户处理的对象数目,并使得子系统使用起来更加容易。
  3. 降低了大型软件系统中的编译依赖性,简化了系统在不同平台之间的移植过程,因为编译一个子系统不会影响其他的子系统,也不会影响外观对象。

缺点:

  1. 不能很好地限制客户使用子系统类,很容易带来未知风险。
  2. 增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。

转载地址:http://pryof.baihongyu.com/

你可能感兴趣的文章
对比iOS中的四种数据存储
查看>>
iOS获取音频或者视频是时间长度
查看>>
ios 调用google api 实现语音识别
查看>>
Introduction to C++ for iOS Developers: Part 1
查看>>
Xcode非ARC项目中设置部分文件ARC支持
查看>>
UIWindow & UIWindowLevel笔记
查看>>
Creating an Xcode4 Plugin
查看>>
iOS截取视频某一帧图片(关键帧,AVAssetImageGenerator)
查看>>
SDWebImage缓存图片的机制
查看>>
更轻量的 View Controllers
查看>>
谈谈编程思想
查看>>
iOS MapKit导航及地理转码辅助类
查看>>
检测iOS的网络可用性并打开网络设置
查看>>
简单封装FMDB操作sqlite的模板
查看>>
iOS开发中Instruments的用法
查看>>
iOS:关于获取网络类型和运营商信息
查看>>
使用CoreTelephony获得SIM卡网络运营商名称
查看>>
IOS学习笔记(六)inputAccessoryView,inputView
查看>>
LSCTableView: Building an Open, Drop-in Replacement of UITableView
查看>>
Android 假冒建行网银病毒分析
查看>>