13 外观模式

13.1 外观模式概述

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

在外观模式中,一个子系统的外部与其内部通信通过一个统一的外观类进行,外观类将客户类与子系统的内部复杂性分隔,使得客户类只需要与外观角色打交道,而不需要与子系统内部的很多其他对象交互。

外观模式是迪米特法则的一种具体实现,通过引入一个外观角色降低原有系统的复杂度,同时降低客户类与子系统的耦合度。

此处复习一下迪米特法则的内容描述:

迪米特法则: 每一个软件单元对其他单元都只有最少的信息,而且局限于那些与本单元密切相关的软件单元。迪米特法则要求一个软件实体应该尽可能少地与其他实体发生相互作用。

外观模式结构图如下所示:

13.2 外观模式实现

13.2.1 外观类

客户端调用外观类的方法,外观类将客户端请求委派给相应的子系统处理。

public class Facade {
private SubSystemA subA = new SubSystemA();
private SubSystemB subB = new SubSystemB();
private SubSystemC subC = new SubSystemC(); public void method(String s) {
String resA = subA.methodA(s);
String resB = subB.methodB(resA);
subC.methodC(resB);
}
}

13.2.2 子系统类

子系统处理外观类传过来的请求;子系统并不知道外观类的存在,外观类仅仅是封装了多个请求的一个客户端。

public class SubSystemA() {
public String methodA(String s) {
// 业务逻辑代码
}
} public class SubSystemB() {
public String methodB(String s) {
// 业务逻辑代码
}
} public class SubSystemC() {
public void methodA(String s) {
// 业务逻辑代码
}
}

13.2.3 客户端调用

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

13.3 抽象外观类

在上述外观模式中,如果需要增加或删除与外观类交互的子系统类,必须修改原有代码,违背开闭原则,因此可以通过引入抽象外观类对系统进行改进。

引入抽象外观类的外观模式结构图如下所示:

引入抽象外观类之后,客户端可以针对抽象层编程,对于新的业务需求,不需要修改原有的外观类,直接增加一个新的具体外观类即可,符合开闭原则。

13.4 外观模式优/缺点

外观模式使用场景:菜单栏或工具栏

外观模式的优点主要如下:

  • 对客户端屏蔽子系统组件,将客户端代码简化,与之关联的对象也减少
  • 实现了子系统与客户端之间的松耦合关系,使得子系统发生变化,无须修改客户端,只调整外观类即可

外观模式的缺点主要如下:

  • 不能很好的限制客户端直接使用子系统类,子系统类对客户端是可见的,不好限制客户端只能去调用外观类;
  • 设计不当会导致增加新的业务逻辑需要修改原有代码(未引入抽象外观类)

Java设计模式 —— 外观模式的更多相关文章

  1. Java设计模式——外观模式

    JAVA 设计模式 外观模式 用途 外观模式 (Facade) 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 外观模式是一种结构型模式. 结构

  2. 【设计模式】Java设计模式 - 外观模式

    Java设计模式 - 外观模式 不断学习才是王道 继续踏上学习之路,学之分享笔记 总有一天我也能像各位大佬一样 原创作品,更多关注我CSDN: 一个有梦有戏的人 准备将博客园.CSDN一起记录分享自己 ...

  3. java设计模式——外观模式(门面模式)

    一. 定义与类型 定义:门面模式,提供一个统一的接口,用来访问子系统中的一群接口,门面模式定义了一个高层接口,让子系统更容易使用 类型:结构性 二. 使用场景 子系统越来越复杂,增加外观模式提供简单调 ...

  4. JAVA 设计模式 外观模式

    用途 外观模式 (Facade) 为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 外观模式是一种结构型模式. 结构

  5. Java设计模式---外观模式

    外观模式(Facade) 外观模式的意图是:为子系统提供一个接口,便于它的使用.   解释: 简单的说,外观模式就是封装多个上层应用需要的方法,使得上层调用变得简单,为上层提供简单的接口,是设计模式中 ...

  6. Java设计模式-外观模式(Facade)

    外观模式是为了解决类与类之家的依赖关系的,像spring一样,可以将类和类之间的关系配置到配置文件中,而外观模式就是将他们的关系放在一个Facade类中,降低了类类之间的耦合度,该模式中没有涉及到接口 ...

  7. 菜鸟版JAVA设计模式—外观模式

    外观模式是一种比較easy理解的模式,作用非常easy.就是解耦合. 结构也是非常easy,一个外观类.这个外观类持有非常多的业务类. 再由客户类去调用这个外观类去实现一些列的业务操作... 这个模式 ...

  8. java设计模式----外观模式(门面模式)

    外观模式主要应用场景在于为复杂的子系统提供一个简单的接口,提高子系统的独立性. 创建DrawerOne类: package facade; public class DrawerOne { publi ...

  9. Java设计模式——组合模式

    JAVA 设计模式 组合模式 用途 组合模式 (Component) 将对象组合成树形结构以表示“部分-整体”的层次结构.组合模式使得用户对单个对象和组合对象的使用具有唯一性. 组合模式是一种结构型模 ...

  10. java设计模式--单列模式

    java设计模式--单列模式 单列模式定义:确保一个类只有一个实例,并提供一个全局访问点. 下面是几种实现单列模式的Demo,每个Demo都有自己的优缺点: Demo1: /** * 单列模式需要满足 ...

随机推荐

  1. uniapp+uView单选框多选框使用与模糊搜索

    <template> <!-- 类别筛选组件 --> <view class="timeInput">{{filterArea}} <u- ...

  2. 三,打包electron

    1,在当前项目下运行 npm install --save-dev @electron-forge/cli npx electron-forge import 此时package.json内容如下: ...

  3. 二维Svg转矢量 不支持Svg2.0

    import { ElMessage } from 'element-plus' import { parse } from 'svgson' import JsonToView from './vi ...

  4. Ubuntu常用环境配置

    gcc sudo apt-get install build-essential update-alternatives 管理python环境 # 添加版本 # update-alternatives ...

  5. 简单的helloworld指令

    Hello World指令 1.下载安装notepad++ 2.新建文本文档 3.鼠标右键单击Edit with Noteapd++ 编辑程序并保存 public class hello{ publi ...

  6. java map重写 转大写、转驼峰

    /** * @author admin * @Description * 转大写 */ public class HashMapUpper<V> extends HashMap<St ...

  7. 【原创】2022年linux环境下QT6不支持中文输入法解决方案

    1.配置环境 export PATH="~/目录/Qt/6.x.x/gcc_64/bin":$PATH export PATH="~/目录/Qt/Tools/Cmake/ ...

  8. JavaScript for in循环,for of循环

    一.JavaScript for/in 语句循环遍历对象的属性 var person={fname:"Bill",lname:"Gates",age:56}; ...

  9. java 1.8 API帮助文档

    链接:https://pan.baidu.com/s/1MNZqIokMDWNZF-nXnoHzxA 提取码:zw13

  10. 渲染器的实现(1)--《vue.js设计与实现》

    function renderer(domString, container) { container.innerHTML = domString } let count = ref(1) rende ...