Java 23种设计模式(9.结构型模式-外观模式)

news2024/11/27 5:29:11

结构型模式-外观模式

代码详解

类图

在这里插入图片描述

代码

public class SubOne {
    public void method1(){
        System.out.println("method1");
    }
}
public class SubTwo {
    public void method2(){
        System.out.println("method2");
    }
}
public class SubThree {
    public void method3(){
        System.out.println("method3");
    }
}
public class SubFour {
    public void method4(){
        System.out.println("method4");
    }
}
public class Facade {
    private SubOne subOne;
    private SubTwo subTwo;
    private SubThree subThree;
    private SubFour subFour;
    Facade(){
        subOne=  new SubOne();
        subTwo=  new SubTwo();
        subThree=  new SubThree();
        subFour=  new SubFour();

    }
    public void  methodA(){
        subOne.method1();
        subTwo.method2();
    }
    public void  methodB(){
        subThree.method3();
        subFour.method4();
    }
}

运行结果

public class Client {
    public static void main(String[] args) {
        Facade facade = new Facade();
        facade.methodA();
        System.out.println("====");
        facade.methodB();
    }
}

1.概述

有些人可能炒过股票,但其实大部分人都不太懂,这种没有足够了解证券知识的情况下做股票是很容易亏钱的,刚开始炒股肯定都会想,如果有个懂行的帮帮手就好,其实基金就是个好帮手,支付宝里就有
许多的基金,它将投资者分散的资金集中起来,交由专业的经理人进行管理,投资于股票、债券、外汇等领域,而基金投资的收益归持有者所有,管理机构收取一定比例的托管管理费用。

定义

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

外观(Facade)模式是“迪米特法则”的典型应用

在这里插入图片描述

2.结构

外观(Facade)模式包含以下主要角色:
外观(Facade)角色为多个子系统对外提供一个共同的接口
子系统(Sub System)角色:实现系统的部分功能,客户可以通过外观角色访问它。

3. 类图

【例】智能家电控制
小明的爷爷已经60岁了,一个人在家生活:每次都需要打开灯、打开电视、打开空调;睡觉时关闭灯、关闭电视、关闭空调;操作起来都比较麻烦。所以小明给爷爷买了智能音箱,可以通过语音直接控制这
些智能家电的开启和关闭。类图如下:

在这里插入图片描述

4. 代码

public class Light {
    public void on(){
        System.out.println("open the light");
    }
    public void off(){
        System.out.println("close the light");
    }
}

public class TV {
    public void on(){
        System.out.println("open the TV");
    }
    public void off(){
        System.out.println("close the TV");
    }
}
public class AirCondition {
    public void on(){
        System.out.println("open the AirCondition");
    }
    public void off(){
        System.out.println("close the AirCondition");
    }
}

public class SmartAppliancesFacade {
    private Light light;
    private TV tv;
    private  AirCondition airCondition;

    public SmartAppliancesFacade() {
        light = new Light();
        tv = new TV();
        airCondition =new AirCondition();
    }
    public void say(String message){
        if(message.contains("open")){
            on();
        }else if(message.contains("close")){
            off();
        }else{
            System.out.println("I can not understand what you say");
        }
    }
    public void on(){
        light.on();
        tv.on();
        airCondition.on();
    }
    public void off(){
        light.off();
        tv.off();
        airCondition.off();

    }
}
public class Client {
    public static void main(String[] args) {
        SmartAppliancesFacade s = new SmartAppliancesFacade();//创建智能音箱对象
        s.say("open anythings");//控制家电
        System.out.println("================");
        s.say("close anythings");
    }
}

open the light
open the TV
open the AirCondition
================
close the light
close the TV
close the AirCondition

5.优缺点

好处:
降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户类。
对客户屏蔽了子系统组件,减少了客户处理的对象数目,并使得子系统使用起来更加容易。
缺点:
不符合开闭原则,修改很麻烦

6. 使用场景

  • 对分层结构系统构建时,使用外观模式定义子系统中每层的入口点可以简化子系统之间的依赖关系。
  • 当一个复杂系统的子系统很多时,外观模式可以为系统设计一个简单的接口供外界访问。
  • 当客户端与多个子系统之间存在很大的联系时,引入外观模式可将它们分离,从而提高子系统的独立性和可移植性。

7.源码解析

使用tomcat作为web容器时,接收浏览器发送过来的请求,tomcat会将请求信息封装成ServletRequest对象,如下图①处对象。但是大家想想ServletRequest是一个接口,它还有一个子接口HttpServletRequest,而我们知道该request对象肯定是一个HttpServletRequest对象的子实现类对象,到底是哪个类的对象呢?可以通过输出request对象,我们就会发现是一个名为RequestFacade的类的对象。
在这里插入图片描述
RequestFacade类就使用了外观模式。先看结构图:
在这里插入图片描述
为什么在此处使用外观模式呢?
定义 RequestFacade 类,分别实现 ServletRequest ,同时定义私有成员变量 Request ,并且方法的实现调用 Request 的实现。然后,将 RequestFacade上转为 ServletRequest 传给servlet 的 service 方法,这样即使在 servlet 中被下转为 RequestFacade ,也不能访问私有成员变量对象中的方法。既用了 Request ,又能防止其中方法被不合理的访问。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/180752.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VSCode配置C/C++环境

(1).配置编译器 接下来配置编译器路径,按快捷键CtrlShiftP调出命令面板,输入C/C,选择“Edit Configurations(UI)”进入配置。这里配置两个选项: - 编译器路径:D:/mingw-w64/x86_64-8.1.0-win32-seh-rt_v6-rev0/mingw64…

3D创作元素将入住下一代Windows 10和HoloLens中

新 Windows 10 将会带来崭新的 3D 特性,任何用户都可以通过内置的工具来制作发布有关「3D、增强现实 AR 和混合现实 (mixed reality) 的游戏和素材」。 北京时间 10 月 26 号晚 10 点,微软在纽约召开的新品发布会如期而至。会上微软发布了大家期待已久的…

【Linux】进程的概念 | 进程控制块 PCB | task_struct

🤣 爆笑教程 👉 《看表情包学Linux》👈 猛戳订阅 🔥 💭 写在前面:本章我们将带着大家深入理解 "进程" 的概念,"进程" 这个概念其实使我们一直在接触的东西,只不…

浅谈操作系统

操作系统是一组主管并控制计算机操作、运用和运行硬件、软件资源和提供公共服务来组织用户交互的相互关联的系统软件程序。根据运行的环境,操作系统可以分为桌面操作系统,手机操作系统,服务器操作系统,嵌入式操作系统等。 通俗来…

Three.js坐标系与变换矩阵快速入门

很多东西汇集在一起构成一个美丽的 3D 场景,例如光照、材质、模型、纹理、相机设置、后期处理、粒子效果、交互性等等,但无论我们创建什么样的场景,没有比这更多的了 比组成它的乐曲的排列和运动更重要。 要创建建筑效果图,我们必…

CDH数仓项目(一) —— CDH安装部署搭建详细流程

0 说明 本文以CDH搭建数据仓库,基于三台阿里云服务器从零开始搭建CDH集群,节点配置信息如下: 节点内存安装服务角色chen10216Gcloudera-scm-serverchen1038Gcloudera-scm-agentchen1048Gcloudera-scm-agent 上传需要用到的安装包&#xff1…

[NPUCTF2020]ezinclude

目录 前提知识 信息收集 解题思路 前提知识 PHP LFI 利用临时文件 Getshell 姿势-安全客 - 安全资讯平台 PHP LFI 利用临时文件Get shell php7 Segment Fault&#xff08;7.0.0 < PHP Version < 7.0.28&#xff09; PHPINFO特性 信息收集 查看源码 <!--md5($secr…

【进阶】Spring MVC程序开发

努力经营当下&#xff0c;直至未来明朗&#xff01; 文章目录一、Spring MVC概述1. MVC定义2. MVC和Spring MVC的关系二、为什么要学Spring MVC三、如何学Spring MVC一&#xff09; 实现用户和程序的映射方法1&#xff1a;路由RequestMapping(“/xxx”)方法2&#xff1a; 使用P…

Python纯手动搭建BP神经网络(手写数字识别)

来源&#xff1a;投稿 作者&#xff1a;张宇 编辑&#xff1a;学姐 实验介绍 实验要求&#xff1a; 实现一个手写数字识别程序&#xff0c;如下图所示&#xff0c;要求神经网络包含一个隐层&#xff0c;隐层的神经元个数为15。 整体思路&#xff1a; 主要参考西瓜书第五章神…

一款超赞的算法可视化工具,让算法过程动态展示出来

从文字或者图片中学习算法还是一件很无聊的事。当然&#xff0c;现在有许多很棒的网站可以查看各种算法的动画。然而&#xff0c;对于开发人员来说&#xff0c;如果能将实现算法的代码的实际执行操作通过可视化展现出来&#xff0c;那就是最好不过了。推荐一款开源工具&#xf…

深度学习——编码器

1.复习CNN 在CNN中&#xff0c;输入一张图片&#xff0c;经过多层的卷积层&#xff0c;最后输出层判别图片中的物体的类别。 CNN使用卷积层做特征提取&#xff08;编码&#xff09;&#xff0c;使用Softmax回归做预测&#xff08;解码&#xff09; ①编码器&#xff1a;将输入…

ArrayList扩容机制~

ArrayList()//会使用长度为零的数组 ArrayList(int initialCapacity)//会使用指定容量的数组 public ArrayList(Collection<?extends E>c>//会使用c的大小作为数组容量假设我们设置一个列表的最初容量为10&#xff0c;如下所示&#xff1a; ArrayList<Integer>…

【Python从入门到进阶】5、变量的定义及数据类型

接上篇《4、pycharm的安装及使用》 上一篇我们学习了python编程工具pycharm的安装及基本使用。后续篇章我们正式来学习Python语言的语法和特性&#xff0c;本篇我们主要学习Python变量的定义及数据类型。 一、注释 1、注释介绍 在工作编码的过程中&#xff0c;如果一段代码的…

(深度学习快速入门)第三章第三节4:深度学习必备组件之TensorBoard和标准化技术

文章目录一&#xff1a;TensorBoard&#xff08;1&#xff09;TensorBoard介绍&#xff08;2&#xff09;Pytorch安装TensorBoard&#xff08;3&#xff09;TensorBoard使用&#xff08;4&#xff09;服务器tensorboard本地显示&#xff08;5&#xff09;AutoDL等算力平台tenso…

07技术太卷我学APEX-动态菜单+URL传参数给页面

07技术太卷我学APEX-动态菜单URL传参数给页面 0 应用场景 《技术太卷我学APEX》收集的项目越来越多&#xff0c;我想把【类】【子类】加到导航菜单栏&#xff0c;点击不同的分类菜单栏&#xff0c;对列表进行过滤&#xff0c;也可以全部浏览&#xff0c;如下图&#xff1a; …

JAVA SE复习(第1章 Java概述)

本文笔记来自硅谷柴林燕老师的笔记 只为自己看笔记方便使用 不做他用 目录 第1章 Java概述 1.1 Java语言发展历史&#xff08;记关键点&#xff09; 1.2 Java语言特点&#xff08;后面需要关注和体会&#xff09; 1.3 Java语言跨平台原理&#xff08;理解&#xff09; 1…

4. 网络编程之TCP编程

1. 《计算机网络编程》 我们接触网络编程&#xff0c;肯定是要对网络编程的一些专业术语及基本理论知识是要有所认知的。python网络编程无非是在这些基础理论知识之上给我们提供了一些方便实用的网络库来供我们使用。尽管做了非常底层的封装&#xff0c;并且给我们暴露了上层的…

java IO流之缓冲流详解

缓冲流概述 缓冲流也称为高效流或者高级流。之前我们学习的字节流、字符流可以成为基本流。 作用&#xff1a;缓冲流自带缓冲区、可以提高基本字节流、字符流读写数据的性能。 分类&#xff1a; BufferedInputStream -->字节缓冲输入流 BufferedOutputStream–>字节缓冲输…

ch1_1计算机系统概论

1. 内容安排 1.1 概论 1.2 计算机系统的硬件结构 存储器&#xff0c;I/O 输入与输出&#xff1b;系统总线&#xff1b;CPU 1.3 第三篇 CPU 中央处理器中&#xff0c;所包含的内容&#xff1a; ALU&#xff0c; CUCPU 内部互连寄存器 1.4 CU CU &#xff1a; control uni…

最新虚幻5引擎(UE5)游戏性能的影响详解

Unreal Engine 5 是由 Unreal Engine 公司开发的一款游戏引擎。5 代表引擎的主要版本号。它专为创建多人在线游戏、手机游戏、高端游戏和虚幻应用程序而设计。从图中可以看出&#xff0c;随着场景复杂度的增加&#xff0c;UE5的内存占用会逐渐增加。当然&#xff0c;这并不意味…