外观设计模式

2023-11-20

根据实际案例分析外观模式 Facade

  1. 案例: 假设一个放电影功能,在播放电影时,需要放下窗帘,打开空调,打开播放机,打开音响,考虑用户观影时间较长时,提供暂停播放,窗帘上升,关闭音响,关闭空调,当播放完毕后,升起窗帘全部关闭
  2. 传统模式下客户端可能需要一个一个的进行调用,客户端调用比较繁琐,
  3. 外观模式: 对子系统中的接口进行分组,对一组接口提供一个一致的外部访问接口,通过这个接口屏蔽内部实现细节,调用者根据功能调用一个接口即可,减少其它步骤,无需关心细节

示例

  1. 创建功能实体类,电影,窗帘,空调,音响
//电影
class Film{
    public void start(){
        System.out.println("开始播放电影");
    }
    public void stop(){
        System.out.println("暂停播放,休息一下");
    }
    public void end(){
        System.out.println("电影播放结束");
    }
}
//窗帘
class Curtain{
    public void up(){
        System.out.println("升起窗帘");
    }
    public void down(){
        System.out.println("下降窗帘");
    }
}
//空调
class AirConditioner{
    public void start(){
        System.out.println("启动空调");
    }
    public void stop(){
        System.out.println("暂停空调");
    }
    public void end(){
        System.out.println("关闭空调");
    }
}
//音响
class Sound{
    public void start(){
        System.out.println("启动音响");
    }
    public void end(){
        System.out.println("关闭音响");
    }
}
  1. 创建外观类,将具体功能类组合到外观类中,注意根据需求,选择实例化的功能类在外观者中的实例化方式,此处为了方便在外观类的构造器中new实例化,定义功能方法,对具体功能类的功能进行分组,通过该方法进行统一调用
//外观者
class Home{
    //将功能类组合进来,注意初始化方式,
    //此处因为做示例,在构造器中new创建
    //实际可以根据需求,选在初始化方式
    //例如在功能类中提供实例化方法,在
    //外观者构造器中进行调用
    private Film film;
    private Curtain curtain;
    private AirConditioner airConditioner;
    private Sound sound;

    //构造器,初始化功能类
    public Home(){
        this.film = new Film();
        this.curtain = new Curtain();
        this.airConditioner = new AirConditioner();
        this.sound = new Sound();
    }

    //根据功能进行分组调用的
    public void start(){
        curtain.down();
        airConditioner.start();
        sound.start();
        film.start();
    }
    //例如在暂停时,窗帘,音响没有暂停,而是升起与关闭
    public void stop(){
       film.stop();
       airConditioner.stop();
       curtain.up();
       sound.end();
    }
    public void end(){
        film.end();
        airConditioner.end();
        curtain.up();
        sound.end();
    }
}
  1. 调用测试,客户端通过外观类进行统一调用实现功能
public class Test4 {
    public static void main(String[] args) {
        //客户端在调用时通过外观者,一致调用即可
        Home home = new Home();
        //开始播放
        home.start();
        System.out.println();
        //暂停播放
        home.stop();
        System.out.println();
        //播放结束
        home.end();
    }
}
  1. 流程图(不是UML)
    在这里插入图片描述

业务与设计模式落地案例

  1. 使用外观模式来实现一个简单的订单管理系统
  2. 定义三个子系统类:OrderService、PaymentService 和 ShippingService。分别负责处理订单创建、支付和运输等任务,具体代码如下(由于只是单纯的配合设计模式演示,并且子系统中没有特殊业务,所以当前的service都不需要注入到容器中)
//它处理订单的创建
public class OrderService {
    public void createOrder(String orderInfo) {
        System.out.println("Creating order: " + orderInfo);
    }
}
//处理订单的支付
public class PaymentService {
    public void makePayment(String paymentInfo) {
        System.out.println("Making payment: " + paymentInfo);
    }
}
//处理订单的运输
public class ShippingService {
    public void shipOrder(String address) {
        System.out.println("Shipping to: " + address);
    }
}
  1. 定义一个外观类 OrderFacade,它将上述三个子系统整合在一起,提供一个简单的接口,以便客户端能够更加方便地使用整个订单系统的功能
public class OrderFacade {
    private OrderService orderService;
    private PaymentService paymentService;
    private ShippingService shippingService;

    public OrderFacade(OrderService orderService, PaymentService paymentService, ShippingService shippingService) {
        this.orderService = orderService;
        this.paymentService = paymentService;
        this.shippingService = shippingService;
    }

	//用于封装整个订单处理流程
    public void createOrder(String orderInfo, String paymentInfo, String address) {
        // 创建订单
        orderService.createOrder(orderInfo);

        // 处理支付
        paymentService.makePayment(paymentInfo);

        // 运输订单
        shippingService.shipOrder(address);
    }
}
  1. 提供一个简单的接口 OrderController,用于演示整个订单流程
@RestController
public class OrderController {
    private OrderFacade orderFacade;

    public OrderController() {
        OrderService orderService = new OrderService();
        PaymentService paymentService = new PaymentService();
        ShippingService shippingService = new ShippingService();

        this.orderFacade = new OrderFacade(orderService, paymentService, shippingService);
    }

    @PostMapping("/order")
    public String createOrder(@RequestBody OrderRequest request) {
        orderFacade.createOrder(request.getOrderInfo(), request.getPaymentInfo(), request.getAddress());
        return "Order created successfully.";
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

外观设计模式 的相关文章

  • 使用 BlobOutputStream 在 Azure 中上传 blob

    我正在尝试直接从流上传 blob 因为我不知道我决定尝试的流的长度这个答案 https stackoverflow com a 24621538 3695939 这不起作用 即使它从流中读取并且不会抛出任何异常 内容也不会上传到我的容器 我
  • string.split("(?!^)") 解释

    我正在尝试将字符串的字符拆分为字符串数组 我找到了解决方案here https stackoverflow com questions 5235401 split string into array of character strings
  • 我需要在 Java 9 中使用哪个模块才能使用 JPA?

    我正在使用一个需要 JPA 的项目测试 Java 9 javax persistence 类 当我添加module info java并声明我的模块 下的所有类javax persistece包变得不可用 我搜索了很多 但找不到在 Java
  • Java 7u51/7u55 带星号的清单变量

    我正在部署一个小程序 其中包含清单中的下一个变量 Manifest Version 2 0 Ant Version Apache Ant 1 8 2 Trusted Library true Permissions all permissi
  • selenium 2.0 中的 isElementPresent

    大家好 我正在使用 webdriver 所以如果我想使用 selenium s rc 函数 isElementPresent 我必须模拟 selenium rc 所以我会执行以下操作 import org openqa selenium B
  • Mediaplayer 播放几次后停止播放

    我有一个按钮 按下它会播放一个随机声音剪辑 然后播放另一个声音剪辑 然后通过一个媒体播放器播放另一个声音剪辑 但是多次按下该按钮 15 20 次 后 所有音频都会停止 我在播放最后一个音频剪辑后释放媒体播放器 所以我不认为这是原因 有什么指
  • Java:将二维字符串数组打印为右对齐表格

    是什么best打印a的单元格的方法String 数组作为右对齐表 例如 输入 x xxx yyy y zz zz 应该产生输出 x xxx yyy y zz zz 这似乎是一个should能够完成使用java util Formatter
  • 加密 mongodb 中的密码字段

    我有以下代码 它插入userName and password进入数据库 但密码以纯文本格式存储 我的意思是 当我查看数据库时 我可以看到插入的密码 我想存储password in encrypted format MongoClient
  • Java MYSQL/JDBC 查询从缓存的连接返回过时的数据

    我一直在 Stackoverflow 中寻找答案 但似乎找不到不涉及 Hibernate 或其他数据库包装器的答案 我直接通过 Tomcat 6 Java EE 应用程序中的 MYSQL 5 18 JDBC 驱动程序使用 JDBC 我正在缓
  • 覆盖Java中的属性[重复]

    这个问题在这里已经有答案了 在 Java 中 我最近有几个项目 我使用了这样的设计模式 public abstract class A public abstract int getProperty public class B exten
  • 为什么 CompletableFuture 的 thenAccept() 不在主线程上运行

    我在 CompletableFuture 的 SupplyAsync 中处理长时间运行的操作 并将结果放入 thenAccept 中 有时 thenAccept 在主线程上执行 但有时它在工作线程上运行 但我只想在主线程上运行 thenAc
  • 为什么从类构造函数调用的方法应该是最终的? [复制]

    这个问题在这里已经有答案了 我是一名 Java 新手 我试图理解 Oracle 网站教程中的以下行 https docs oracle com javase tutorial java IandI final html https docs
  • 运行 Espresso 测试时在 Android studio 中找不到属性 android:forceQueryable

    我已经使用 android studio 录制了我的 Android 应用程序 Espresso 测试记录浓缩咖啡测试选项中Run菜单 在记录的最后 我用自己的文件名保存了测试 单击保存按钮后 IDE 会自动在以下位置创建文件Android
  • AWS SQS Batch SendMessageBatchRequest 非常慢

    我的应用程序使用 SendMessageBatchRequest 将每个请求发布 10 条消息到 AWS SQS 每条消息的大小小于250字节 该应用程序预计每天发布约一百万条记录 但要实现这一目标 消息发布的速度非常慢 AmazonSQS
  • Java 中的连接路径

    In Python我可以连接两条路径os path join os path join foo bar gt foo bar 我正在尝试在 Java 中实现相同的目标 而不用担心是否OS is Unix Solaris or Windows
  • Java 9:AES-GCM 性能

    我进行了一个简单的测试来测量AES GCM https en wikipedia org wiki Galois Counter Mode表现在Java 9 通过在循环中加密字节缓冲区 结果有些令人困惑 本机 硬件 加速似乎有效 但并非总是
  • 如果 @transactional 在类级别应用,如何拦截 @transactional 参数

    我想捕获 transactional 的参数 如果它应用于类级别 例如如果 transactional应用在方法级别 例如 class A transactional readOnly true public void someMethod
  • Spring Data MongoDB 和批量更新

    我正在使用 Spring Data MongoDB 并且想要执行批量更新 就像此处描述的那样 http docs mongodb org manual reference method Bulk find update Bulk find
  • “mvn”不被识别为内部或外部命令、可操作程序或批处理文件

    可能是之前问过问题 但我发现了非常奇怪的错误 当我跑步时mvn versionbin 中的命令给出了版本和其他信息 但是 当我跑到垃圾箱外面时 它会出现异常 下面提到的结果 C Program Files apache maven 3 0
  • 在edittext android中插入imageview

    我想将 imageview 放在 edittext 中 可能吗 我检查了 evernote 应用程序 它能够将照片放在编辑文本部分 我想让我的应用程序完全相同 我如何才能将从图库中选择的图像视图放入编辑文本中 我首先尝试将 imagevie

随机推荐

  • 解决iframe在ios中无法滚动的bug

    在解决iframe在ios无法滚动的bug中 需要在iframe外面包裹一层div 如下 div class scroll wrapper div 然后设置scroll wrapper的样式 给scroll wrapper添加 webkit
  • camunda 流程引擎如何开始并行任务,且有哪些实现方式?

    认识并行任务 在流程引擎开发中 稍微复杂一点的项目都会遇到并行任务 什么是并行任务呢 就是在完成一个流程节点后 下一步会同时开始多个任务 且任务与任务之间互不影响 这个说起来真的有点绕 刚开始我真不理解 试了好多次才想明白 下面就画2条不同
  • 错误的分页写法及修改

    一 错误的写法 api GetMapping groupList ApiImplicitParams ApiImplicitParam name current value 页码 required true dataType Long da
  • MMdetection学习笔记 第一步安装配置

    安装 之前的安装老是出问题 这里重新仔细进行第三遍 参考了哔哩哔哩的视频教程 mmdetection 教程 使用篇 https www bilibili com video BV1Jb4y1r7ir p 3 share source cop
  • Qt(windows下)捕获异常信息并自动重启

    参考 https blog csdn net x85371169 article details 79267592 目前在弄一个工业上用的软件 需要实现无人值守功能 软件经过两三个星期的debug 已经将绝大部分导致软件死机的bug修复 但
  • 使用burpsuite对web进行账号密码暴力破解

    一 打开环境 1 打开php 2 打开burp suite 3 打开小狐狸 进入127 0 0 1 pikachu 二 Repeater 重发器 1 访问pikachu 多次进行用户名和密码的登录 描述 2 burp suite 中抓包 3
  • set和multiset的用法详解

    一 set文档介绍 1 set是按照一定次序存储元素的容器 2 在set中 元素的value也标识它 value就是key 类型为T 并且每个value必须是唯一的 set中的元素 不能在容器中修改 元素总是const 但是可以从容器中插入
  • 【语义分割】2、Mapillary 数据集简介

    文章目录 一 简介 二 类别 三 标注示例 一 简介 Mapillary Vistas 数据集包含 66 类共 25 000 张高分辨率街景场景的数据 其中有 37 个类是以实例区分的标签 数据总量是 cityscapes 的5倍之多 包括
  • Open3D 基于点云高程制作热力图

    目录 一 概述 二 代码实现 三 结果展示 一 概述 如题 基于点云的高程来制作热力图渲染赋色点云 其结果如下图所示 二 代码实现 import numpy as np import open3d as o3d from matplotli
  • leetcode刷题方法

    leetcode刷题方法 一 范围内的200题 二 刷题步骤 三 算法思路 四 更新 1 12日留 此文章借鉴 陈同学在搬砖 微信公众号的一篇文章 https mp weixin qq com s xr2abGNv8wDZJ qyN4Kew
  • HTML、CSS、JavaScript分别实现什么功能?

    学习Web前端开发基础技术需要掌握 HTML CSS JavaScript 那么这三个都是分别实现什么功能的呢 下面和小编一起来看看吧 一 HTML是网页内容的载体 内容就是网页制作者放在页面上想要让用户浏览的信息 可以包含文字 图片 视频
  • Springboot整合dubb3+nacos作注册中心(基础篇)

    1 首先看下项目结构如下 2 新建父工程springboot dubbo模块 pom文件如下
  • 亲测可用,SpringBoot项目打印接口请求信息日志,CommonsRequestLoggingFilter实现方式

    文章目录 需求背景 效果图 实现思路 其他方案对比 优缺点分析 具体实现 需求背景 线上项目出现bug时 可以通过接口的请求参数来排查定位问题 和业务方battle时 能够证明他是自己操作的问题 效果图 实现思路 Spring提供了Comm
  • 重试机制的实现(4m,10m,10m,1h,2h,6h,15h)

    项目场景 由于我们现在所做的项目有有很多的外放接口供代理商调用 但是有些接口的响应并不是实时返回的 此时我们就需要使用回调接口的方式 将信息响应给代理商 在这期间可能会出网络不稳定等其他情况 导致回调接口调用失败 所以需要特定的回调重试机制
  • 数据库系统原理---封锁

    封锁 封锁粒度 MySQL中提供了两种封锁粒度 行级锁和表级锁 应该尽量的只锁定需要修改的那部分数据 而不是所有的资源 锁定的数据量越少 发生锁争用的可能性就越小 系统的并发程度就越高 加锁需要消耗资源 锁的各种操作 包括锁的获取 释放锁
  • org.elasticsearch.bootstrap.StartupException: java.lang.IllegalArgumentExceptio

    这是我转载的一片文章 解决了我的问题 所以记录一下 话不多说 见正文吧 elasticsearch安装踩过的那些坑 坑1 failed to send join request to master 原因 你复制了某个节点的elasticse
  • supervisor系列:5、日志

    supervisor系列 5 日志 文章目录 supervisor系列 5 日志 1 活动日志 1 1 活动日志输出示例 1 2 活动日志等级 1 3 活动日志轮换 2 子进程日志 2 1 捕获模式 supervisord执行的主要任务之一
  • 一文带你从IntelliJ IDEA中一键生成Controller、Service、Dao、Model层代码,真的不看看吗?

    前言 EasyCode插件介绍与安装 简介EasyCode是基于IntelliJ IDEA开发的代码生成插件 支持自定义任意模板 Java html js xml 只要是与数据库相关的代码都可以通过自定义模板来生成 支持数据库类型与java
  • LoadRunner用户验证码和验证码使用脚本

    Action 定义Md5变量用来存放使用md5加密后的字符串 char Md5 33 存放包含用户登录信息的URL char str 174 存放用户账户信息 char str1 92 存放当前时间 int t1 int a char Me
  • 外观设计模式

    外观设计模式 根据实际案例分析外观模式 Facade 示例 业务与设计模式落地案例 根据实际案例分析外观模式 Facade 案例 假设一个放电影功能 在播放电影时 需要放下窗帘 打开空调 打开播放机 打开音响 考虑用户观影时间较长时 提供暂