外观模式

定义:

为子系统中的一组接口提供一个统一的入口。外观模式定义
了一个高层接口,这个接口使得这一子系统更加容易使用。

外观模式又称为门面模式,它是一种对象结构型模式。

外观模式是迪米特法则的一种具体实现

通过引入一个新的外观角色可以降低原有系统的复杂度

同时降低客户类与子系统的耦合度

图构:

Facade(外观角色):在客户端可以调用它的方法,在外观角色中可以知道相关的(一个
或者多个)子系统的功能和责任;在正常情况下,它将所有从客户端发来的请求委派到相应
的子系统去,传递给相应的子系统对象处理

SubSystem(子系统角色):在软件系统中可以有一个或者多个子系统角色,每一个子系统
可以不是一个单独的类,而是一个类的集合,它实现子系统的功能;每一个子系统都可以被
客户端直接调用,或者被外观角色调用,它处理由外观类传过来的请求;子系统并不知道外
观的存在,对于子系统而言,外观角色仅仅是另外一个客户端而已

主要目的在于降低系统的复杂程度,在面向对象软件系统中,类与类之间的关系
越多,不能表示系统设计得越好,反而表示系统中类之间的耦合度太大,这样的系统在维护
和修改时都缺乏灵活性,因为一个类的改动会导致多个类发生变化,而外观模式的引入在很
大程度上降低了类与类之间的耦合关系。

引入外观模式之后,增加新的子系统或者移除子系
统都非常方便,客户类无须进行修改(或者极少的修改),只需要在外观类中增加或移除对
子系统的引用即可。从这一点来说,外观模式在一定程度上并不符合开闭原则,增加新的子
系统需要对原有系统进行一定的修改,虽然这个修改工作量不大。

事例:

子系统角色

public class Computer {public void open(){System.out.println("打开电脑");}
}

public class Light {public void open(){System.out.println("打开电灯");}
}

public class Phone {public  void open(){System.out.println("打开手机");}
}

外观角色

public class Facade {private  Light light,light1;private Computer computer;private Phone phone;public Facade(){light = new Light();light1 = new Light();computer = new Computer();phone = new Phone();}public void open(){light.open();light1.open();phone.open();computer.open();}
}

public class client {public static void main(String[] args) {Facade facade;facade = new Facade();facade.open();}
}

图构:

优点

(1) 它对客户端屏蔽了子系统组件,减少了客户端所需处理的对象数目,并使得子系统使用起
来更加容易。通过引入外观模式,客户端代码将变得很简单,与之关联的对象也很少。

(2) 它实现了子系统与客户端之间的松耦合关系,这使得子系统的变化不会影响到调用它的客
户端,只需要调整外观类即可。

(3) 一个子系统的修改对其他子系统没有任何影响,而且子系统内部变化也不会影响到外观对

缺点

(1) 不能很好地限制客户端直接使用子系统类,如果对客户端访问子系统类做太多的限制则减
少了可变性和灵活 性。

(2) 如果设计不当,增加新的子系统可能需要修改外观类的源代码,违背了开闭原则

适用场景:

(1) 当要为访问一系列复杂的子系统提供一个简单入口时可以使用外观模式。

(2) 客户端程序与多个子系统之间存在很大的依赖性。引入外观类可以将子系统与客户端解耦,从而提高子系统的独立性和可移植性。

(3) 在层次化结构中,可以使用外观模式定义系统中每一层的入口,层与层之间不直接产生联系,而通过外观类建立联系,降低层之间的耦合度。

转载于:https://www.cnblogs.com/Mrchengs/p/10897111.html

12、设计模式-结构型模式-外观模式相关推荐

  1. Java设计模式之结构型:外观模式

    一.什么是外观模式: 外观模式通过对客户端提供一个统一的接口,用于访问子系统中的一群接口.使用外观模式有以下几点好处: (1)更加易用:使得子系统更加易用,客户端不再需要了解子系统内部的实现,也不需要 ...

  2. 设计模式(结构型)之代理模式(Proxy Pattern)

    PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbob ...

  3. 设计模式 - 结构型 - 装饰者模式

    2019独角兽企业重金招聘Python工程师标准>>> 介绍 意图:动态地给一个对象添加一些额外的职责.就增加功能来说,装饰器模式相比继承更为灵活. 主要解决:一般的,我们为了扩展一 ...

  4. [设计模式-结构型]享元模式(Flyweight )

    概括 名称 Flyweight 结构 动机 运用共享技术有效地支持大量细粒度的对象. 适用性 一个应用程序使用了大量的对象. 完全由于使用大量的对象,造成很大的存储开销. 对象的大多数状态都可变为外部 ...

  5. 【设计模式·结构型】桥接模式Bridge Pattern

    目的 该模式用于分离抽象与实现,并且抽象与实现可以独立变化 应用场景 (1)希望抽象和实现之间没有固定的绑定关系,不同抽象接口和实现可以组合和扩充,程序运行时动态选择.切换具体实现 (2)类层次结构, ...

  6. 设计模式(结构型)之享元模式(Flyweight Pattern)

    PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbob ...

  7. Java设计模式之结构型:组合模式

    前言: 我们对于上面两幅图片肯定非常熟悉,这两幅图片我们都可以看做是一个文件结构,对于这样的结构我们称之为树形结构.在数据结构中我们知道可以通过调用某个方法来遍历整个树,当我们找到某个叶子节点后,就可 ...

  8. Java设计模式之结构型:代理模式

    前言: 我们一般在租房子时会去找中介,为什么呢?因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你做:再比如我们打官司需要请律师,因为律师在法律方面有专长,可以替我们进行操作,表达我们 ...

  9. Java设计模式之结构型:桥接模式

    一.什么是桥接模式: 桥接,顾名思义,就是用来连接两个部分,使得两个部分可以互相通讯,桥接模式的作用就是为被分离的抽象部分和实现部分搭桥.在现实生活中一个物品在搭配不同的配件时会产生不同的动作和结果, ...

  10. 《设计模式详解》结构型模式 - 外观模式

    外观模式 5.5 外观模式 5.5.1 概述 5.5.2 结构 5.5.3 案例 5.5.4 使用场景 5.5.5 Tomcat 源码 完整的笔记目录:<设计模式详解>笔记目录,欢迎指点! ...

最新文章

  1. 注册ETM钱包瓜分糖果 更有机会独享8888元现金奖励
  2. python代码大全p-Python5种代码维护工具
  3. Java 类型和数据库类型怎么实现相互映射?
  4. python读写kafka集群(转载+自己验证)
  5. FPGA串口(UART)通信协议制定与设计思路详解示例
  6. eclipse查看git地址_使用Git进行版本控制
  7. 使用Infinispan进行Camel的事务性缓存
  8. 设计模式(二十三)—— 模板方法
  9. 任天堂的好日子還會繼續嗎﹖
  10. Python机器学习数据预处理:读取txt数据文件并切分为训练和测试数据集
  11. 字符串的HashCode可能相同
  12. nvme固件升级 linux,Intel NVME SSD 固件升级步骤
  13. 傲梅分区助手 linux,傲梅分区助手(详解磁盘操作)
  14. 使用php生成条形码
  15. PR 2019 快速入门(8)
  16. mysql网站倒计时代码_最简单的一个网页倒计时代码 时间到期后会显示出提醒内容 收藏版...
  17. 软考软件设计师备考详细介绍
  18. mysql 幻读 mvcc_MVCC 能解决幻读吗?
  19. Celery实现短信注册接口
  20. 图像处理(六)——图像压缩

热门文章

  1. python set_Python Set联合
  2. Python注释和声明
  3. mac memcached_如何在Mac OS上安装Memcached Server
  4. motion filter_Android Motion布局
  5. viewflipper_Android ViewFlipper示例教程
  6. Hibernate会话工厂
  7. 在Objective-C中分类对象和方法
  8. arduino图形编程——ardublock
  9. 2021年Java开发者应该学习的技术
  10. Web开发过程中需要学习的知识有哪些?