外观设计模式解读

news2024/10/7 14:21:39

目录

问题引进

传统方式解决影院管理

外观模式基本介绍

概念

外观模式原理类图

分类外观模式的角色

 外观模式解决影院管理

传统方式解决影院管理说明

 外观模式应用实例

 外观模式的注意事项和细节


s统的内部细节 => 外观模式

外观模式基本介绍

概念

1) 外观模式(Facade),也叫“过程模式:外观模式为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用
2) 外观模式通过定义一个一致的接口,用以屏蔽内部子系统的细节,使得调用端只需跟这个接口发生调用,而无需关心这个子系统的内部细节

外观模式原理类图

分类外观模式的角色


1) 外观类(Facade): 为调用端提供统一的调用接口, 外观类知道哪些子系统负责处理请求,从而将调用端的请求代理给适当子系统对象
2) 调用者(Client): 外观接口的调用者
3) 子系统的集合:指模块或者子系统,处理 Facade 对象指派的任务,他是功能的实际提供者

 外观模式解决影院管理

传统方式解决影院管理说明

1) 外观模式可以理解为转换一群接口,客户只要调用一个接口,而不用调用多个接口才能达到目的。比如:在 pc上安装软件的时候经常有一键安装选项(省去选择安装目录、安装的组件等等),还有就是手机的重启功能(把关机和启动合为一个操作)。
2) 外观模式就是解决多个复杂接口带来的使用困难,起到简化用户操作的作用

 外观模式应用实例

1) 应用实例要求
2) 使用外观模式来完成家庭影院项目
3) 思路分析和图解(类图)

DVDPlayer
public class DVDPlayer {

    //使用单例模式, 使用饿汉式
    private static DVDPlayer instance = new DVDPlayer();

    public static DVDPlayer getInstanc() {
        return instance;
    }

    public void on() {
        System.out.println(" dvd on ");
    }

    public void off() {
        System.out.println(" dvd off ");
    }

    public void play() {
        System.out.println(" dvd is playing ");
    }

    public void pause() {
        System.out.println(" dvd pause ..");
    }
}

 Popcorn

public class Popcorn {
    private static Popcorn instance = new Popcorn();
    public static Popcorn getInstance() {
        return instance;
    }
    public void on() {
        System.out.println(" popcorn on ");
    }
    public void off() {
        System.out.println(" popcorn ff ");
    }
    public void pop() {
        System.out.println(" popcorn is poping ");
    }

}
Projector
public class Projector {
    private static Projector instance = new Projector();
    public static Projector getInstance() {
        return instance;
    }
    public void on() {
        System.out.println(" Projector on ");
    }
    public void off() {
        System.out.println(" Projector ff ");
    }
    public void focus() {
        System.out.println(" Projector is Projector ");
    }

}
Stereo
public class Stereo {
    private static Stereo instance = new Stereo();
    public static Stereo getInstance() {
        return instance;
    }
    public void on() {
        System.out.println(" Stereo on ");
    }
    public void off() {
        System.out.println(" Screen off ");
    }
    public void up(){
        System.out.println(" Screen up.. ");
    }
}
TheaterLight
public class TheaterLight {
    private static TheaterLight instance = new TheaterLight();
    public static TheaterLight getInstance() {
        return instance;
    }
    public void on() {
        System.out.println(" TheaterLight on ");
    }
    public void off() {
        System.out.println(" TheaterLight off ");
    }
    public void dim() {
        System.out.println(" TheaterLight dim.. ");
    }
    public void bright() {
        System.out.println(" TheaterLight bright.. ");
    }

}
Screen
public class Screen {
    private static Screen instance = new Screen();
    public static Screen getInstance() {
        return instance;
    }
    public void up() {
        System.out.println(" Screen up ");
    }
    public void down() {
        System.out.println(" Screen down ");
    }
}
HomeTheaterFacade
public class HomeTheaterFacade {
    //定义各个子系统对象
    private TheaterLight theaterLight;
    private Popcorn popcorn;
    private Stereo stereo;
    private Projector projector;
    private Screen screen;
    private DVDPlayer dVDPlayer;
    //构造器
    public HomeTheaterFacade() {
        super();
        this.theaterLight = TheaterLight.getInstance();
        this.popcorn = Popcorn.getInstance();
        this.stereo = Stereo.getInstance();
        this.projector = Projector.getInstance();
        this.screen = Screen.getInstance();
        this.dVDPlayer = DVDPlayer.getInstanc();
    }
    //操作分成 4 步
    public void ready() {
        popcorn.on();
        popcorn.pop();
        screen.down();
        projector.on();
        stereo.on();
        dVDPlayer.on();
        theaterLight.dim();
    }
    public void play() {
        dVDPlayer.play();
    }
    public void pause() {
        dVDPlayer.pause();
    }
    public void end() {
        popcorn.off();
        theaterLight.bright();
        screen.up();
        projector.off();
        stereo.off();
        dVDPlayer.off();
    }
}
Client
public class Client {
    public static void main(String[] args) {

        HomeTheaterFacade homeTheaterFacade = new HomeTheaterFacade();
        homeTheaterFacade.ready();
        homeTheaterFacade.play();
        homeTheaterFacade.end();
    }
}

 外观模式的注意事项和细节

1) 外观模式对外屏蔽了子系统的细节,因此外观模式降低了客户端对子系统使用的复杂性
2) 外观模式对客户端与子系统的耦合关系 - 解耦,让子系统内部的模块更易维护和扩展
3) 通过合理的使用外观模式,可以帮我们更好的划分访问的层次
4) 当系统需要进行分层设计时,可以考虑使用 Facade 模式
5) 在维护一个遗留的大型系统时,可能这个系统已经变得非常难以维护和扩展,此时可以考虑为新系统开发一个Facade 类,来提供遗留系统的比较清晰简单的接口,让新系统与 Facade 类交互,提高复用性
6) 不能过多的或者不合理的使用外观模式,使用外观模式好,还是直接调用模块好。要以让系统有层次,利于维护为目的

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

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

相关文章

XGBoost的介绍

一、XGBoost的介绍 1.什么是XGBoost? XGBoost(eXtreme Gradient Boosting)是一种基于梯度提升树的机器学习算法,它在解决分类和回归问题上表现出色。它是由陈天奇在2014年开发的,如今已成为机器学习领域中最流行和强…

集合框架知识汇总

集合框架 集合 概念:对象的容器,定义了对多个对象进行操作的常用方法。可以实现数组功能 和数组的区别 数组长度固定,集合长度不固定 数组可以存储基本类型和引用类型,集合只能存储引用类型 总结 List集合 有序,有…

软考网工易混淆知识点总结(持续更新中,按照知识点先后排序)

1.数据编码--原码、反码和补码 原码 数值前面增加了一位符号位(即最高位为符号位),该位为0时表示正数,为1时则表示负数,其余各位表示数值的大小反码 正数的反码与原码相同,负数的反码符号位为1,其余各位为该数绝对值的…

大型语言模(LLM) : 提示词工程(一)

今天我学习了DeepLearning.AI的 Prompt Engineering 的在线课程,我想和大家一起分享一下该门课程的一些主要内容。 下面是我们访问大型语言模(LLM)的主要代码: import openaiopenai.api_key XXXXXXXXXdef get_completion(prompt, model"gpt-3.5-…

高性能分布式API网关Kong

目录 1 kong网关简介2 为什么需要 API 网关2.1 和Spring Cloud Gateway区别 3 为什么要使用kong3.1 kong的组成部分3.2 Kong网关的特性 4 kong网关架构4.1 Kong网关请求流程 5 kong 部署5.1 搭建网络5.2 搭建数据库环境5.3 kong网关部署5.3.1 初始化kong数据5.3.2 启动Kong容器…

【项目】树莓派4B镜像安装

本文主要记录下如何使用Raspberry Pi image 软件进行树莓派镜像进行安装。 官网:Raspberry Pi OS – Raspberry Pi 百度网盘: 链接:https://pan.baidu.com/s/1G7z1Fdvk5Chmhj894WPU3A 提取码:xnzw 一、格式化SD卡 若SD卡存在…

释放潜能——解读新时代OEM竞争规则,打造精雕细琢的用户体验

从消费零售全领域的实践观察来看,仅仅凭借产品赢得竞争的时代已经过去,商业模式创新体现在越来越多企业向“产品服务”转变,向用户全生命周期需求挖掘转变。企业与消费者之间的关系从过去的一次性、断点式产品交易,转向持续性、覆…

读写ini配置文件(C++)

文章目录 1、为什么要使用ini或者其它(例如xml,json)配置文件?2、ini文件基本介绍3、ini配置文件的格式4、C读写ini配置文件5、 代码示例6、 配置文件的解析库 文章转载于:https://blog.csdn.net/weixin_44517656/article/details/109014236 1、为什么要…

基于 Web 和 Deep Zoom 的高分辨率大图查看器的实践

基于 Web 和 Deep Zoom 的高分辨率大图查看器的实践 高分辨率大图像在 Web 中查看可以使用 Deep Zoom 技术,这是一种用于查看和浏览大型高分辨率图像的技术,它可以让用户以交互方式浏览高分辨率大图像,并且能够在不影响图像质量的情况下进行…

搭建个人网站 保姆级教程(四)Navicat链接mySql 失败

长时间没有折腾云服务器上的mysql了,今天再次使用Navicat连接云服务器上的mysql时,输入密码报错! 1130 - Host ‘119.130.212.168’ is not allowed to connect to this MySQL server 1.于是Royal TSX 远程服务器查看mysql的状态 systemctl …

通达信标记文字中可能用到的特殊符号大全

特殊符号是难以直接输入的符号,特殊符号是符号的一种,比如说圆圈(〇)、叉号(✕、✖、✘)、五角星(★、☆)、勾号(✓、✔) 。 01.特殊符号简表 ♠♣♧♡♥❤…

chatgpt赋能python:Python强制取整:如何在Python中正确进行取整操作

Python强制取整:如何在Python中正确进行取整操作 Python是一种广泛使用的编程语言,有许多不同的用途,包括数据分析、web开发、机器学习、科学计算等等。Python语言非常容易学习和使用,但有时候它的行为可能会出人意料&#xff0c…

alpa概览

文章目录 背景alpa简介DeviceMesh跨 DeviceMeshes 的 GPU Buffer管理Ray CollectivePipeline parallelism runtime orchestration运行时 背景 LLM训练有3D并行的需求(alpa将数据并行视为张量并行,即张量沿batch切分) 算子间并行的通信成本小…

【Vue】父子组件传参 孙子调用爷爷的方法 provide inject

一. 父传子 父组件先在data中定义要传给子组件的属性名父组件在中引入子组件在components中注册使用步骤 3 中注册好的子组件在 3 中,父传子 (1)利用 : 将父组件的对象、数组、字符串等传给子组件,供子组件使用 (2&am…

Rocky Linux9安装教程

序言 Centos废了,最近在考虑将服务器迁移至Rockylinux系统,在这里记录下安装过程 当前安装版本RockyLinux9.2(minimal版本),VMware Fusion专业版13.0.2 创建虚拟机 第一步: 先下载好ISO文件&#xff0c…

python-高级特性

文章目录 1.生成式2.生成器3.闭包4.装饰器(1)万能装饰器的实现(2)含参数的装饰器(3)多装饰器 5.内置高阶函数 1.生成式 列表生成式就是一个用来生成列表的特定语法形式的表达式。是Python提供的一种生成列表…

2023.6.7小记——什么是FPGA?

最近打算开始继续做一些个人分享,已经太久时间没有写文章了,感觉这样下去肯定不是个好事,当程序员当然是要保持分享~ 标题就暂时先以每天我认为最重要的一点来取,内容不仅限于此。 1. 什么是FPGA? 全称是Field-Progra…

PCL 点云均值漂移算法(MeanShift)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 均值漂移算法是一种非常经典的层次聚类方式,已在二维图像中得到了广泛的应用。这里我们也已二维图像为例来阐述其整个计算过程: 算法基本思想:如下图所示,左侧为实际的图像特征的分布,右侧为基于图像特征分布计…

Linux操作系统——第二章 进程控制

目录 进程创建 fork函数初识 fork函数返回值 写时拷贝 fork常规用法 fork调用失败的原因 进程终止 进程退出场景 进程常见退出方法 _exit函数 exit函数 return退出 进程等待 进程等待必要性 进程等待的方法 wait方法 waitpid方法 获取子进程status 进程程序…

接口测试框架实战 | 通用 API 封装实战

接口测试仅仅掌握 Requests 或者其他一些功能强大的库的用法,是远远不够的,还需要具备能根据公司的业务流程以及需求去定制化一个接口自动化测试框架的能力。所以,接下来,我们主要介绍下接口测试用例分析以及通用的流程封装是如何…