首页 > 编程语言 >Java设计模式 —— 外观模式

Java设计模式 —— 外观模式

时间:2022-10-19 01:23:13浏览次数:100  
标签:外观 Java String 模式 子系统 设计模式 public 客户端

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,String,模式,子系统,设计模式,public,客户端
From: https://www.cnblogs.com/ylyzty/p/16804793.html

相关文章

  • Java I/O(2):NIO中的Channel
    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~   为了解决标准JavaI/O令人难以忍受的效率问题,从JDK1.4开始,NIO出现了(Non-blockingI/O,官方称之为NewI/O)。NIO不但......
  • Java设计模式 —— 装饰模式
    12装饰模式12.1装饰模式概述DecoratorPattern:动态地给一个对象增加一些额外的职责。提供一种比使用子类更加灵活的方案来扩展功能。装饰模式是一种用于替代继......
  • 设计模式 - 动态代理
    设计模式-动态代理什么是代理代购、中介、商家举个栗子:比如有一家美国大学,面向全世界招生,而我们国内的同学,需要去到某个大学。因为我们所处国内,并不知道这个大学......
  • Java云原生崛起微服务框架Quarkus入门实践
    @目录概述定义GraalVM简介为何使用特性官方性能实战入门示例步骤安装GraalVM创建quarkus工程Idea导入项目Idea运行和调试打包成普通的Jar打包成依赖GraalVM二进制文件打包......
  • java -jar 启动带有参数
    java-Xms512M-Xmx512M-Dserver.port=8700-Dspring.config.location=/iflytek/conf/wm-2.1.0/wm-rest.properties-Deureka.client.serviceUrl.defaultZone=http://10......
  • Java中使用List的add方法后元素相同问题
    在写JavaWeb时,我在后端通过JDBC读取了数据后逐个使用List.add()方法添加元素并通过request方法传给jsp页面解析,但是添加以后出现了在列表里有n个(假设添加了n个元素)最后一个......
  • Java动态绑定机制
    本文主要记录韩顺平老师讲解动态绑定机制过程中提到的重点,本文转载此篇博客【Java】动态绑定机制,并对其进行一定的补充,如有侵权会删除。特点当调用对象方法的时候,该方法......
  • Java 集合简介 一
    什么是集合?集合就是由若干个确定的元素所构成的整体。例如,5只小兔构成的集合:在数学中,我们经常遇到集合的概念。例如:●有限集合○一个班所有的同学构成的集合;○一......
  • JavaScript学习--Array数组对象
    定义1.var变量名=newArray(元素列表);如vararr=newArray(1,2,3);2.常用:var变量名=[元素列表];如vararr=[1,2,3];访问arr[索引]=值;如arr[0]=1;ps:数组长度类型均可变 len......
  • JavaScript学习--基础语法03
    流程控制语句if,switch,for,while,dowhile。与之前学过的一样。 函数定义:通过function关键词定义语法:functionfunctionName(参数1,参数2) {  具体代码 }例子fu......