设计模式(八)外观模式

相关文章
设计模式系列

1.外观模式简介

外观模式介绍

当我们开发Android的时候,无论是做SDK还是封装API,我们大多都会用到外观模式,它通过一个外观类使得整个系统的结构只有一个统一的高层接口,这样能降低用户的使用成本。

外观模式定义

为系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得子系统更加容易使用。

外观模式结构图

  • Facade:外观类,知道哪些子系统类负责处理请求,将客户端的请求代理给适当的子系统对象。
  • Subsystem:子系统类,实现子系统的功能,处理外观类指派的任务,注意子系统类不含有外观类的引用。

2.外观模式的简单实现

在上一篇设计模式之装饰模式我们举了武侠的例子,这一篇我们还举武侠的例子,首先我们把武侠张无忌当作一个系统,他作为一个武侠,他本身分为三个系统分别是招式、内功和经脉。

子系统类(Subsystem)

我们知道张无忌的三个系统分别是招式、内功和经脉。那我们来创建它们:

/*** 子系统招式*/
public class ZhaoShi {public void TaiJiQuan(){System.out.print("使用着招式太极拳");}public void QiShangQuan(){System.out.print("使用招式七伤拳");}public void ShengHuo(){System.out.print("使用招式圣火令");}
}
/*** 子系统内功*/
public class NeiGong {public void JiuYang(){System.out.print("使用九阳神功");}public void QianKun(){System.out.print("使用乾坤大挪移");}
}
/*** 子系统经脉*/
public class JingMai {public void jingmai(){System.out.print("开启经脉");}
}

张无忌有很多的武学和内功,怎么将他们搭配,并对外界隐藏呢,我们接下来看看外观类:

外观类(Facade)

这里的外观类就是张无忌,他负责将自己的招式、内功和经脉通过不同的情况合理的运用:

/*** 外观类张无忌*/
public class ZhangWuJi {private JingMai jingMai;private ZhaoShi zhaoShi;private NeiGong neiGong;public ZhangWuJi(){jingMai=new JingMai();zhaoShi=new ZhaoShi();neiGong=new NeiGong();}/*** 使用乾坤大挪移*/public void Qiankun(){jingMai.jingmai();//开启经脉neiGong.QianKun();//使用内功乾坤大挪移}/*** 使用七伤拳*/public void QiShang(){jingMai.jingmai(); //开启经脉neiGong.JiuYang();//使用内功九阳神功zhaoShi.QiShangQuan();//使用招式七伤拳}
}

初始化外观类的同时将各个子系统类创建好。很明显张无忌很好的将自身的各个系统搭配好,如果使用七伤拳的话就需要开启经脉、使用内功九阳神功接下来使用招式七伤拳,如果不开经脉或者使用九阳神功的话那么七伤拳的威力会大打折扣。

客户端调用
public class Test {public static void main(String[] args){ZhangWuJi zhangWuJi=new ZhangWuJi();//张无忌使用乾坤大挪移zhangWuJi.Qiankun();//张无忌使用七伤拳zhangWuJi.QiShang();}
}

当张无忌使用乾坤大挪移或者七伤拳的时候,比武的对手显然不知道张无忌本身运用了什么,同时张无忌也不需要去重新计划使用七伤拳的时候需要怎么做,他已经早就计划好了。如果每次使用七伤拳或者乾坤大挪移时都要计划怎么做很显然会增加成本并贻误战机。另外张无忌也可以改变自己的内功、招式和经脉,这些都是对比武的对手有所隐藏的。
外观模式本身就是将子系统的逻辑和交互隐藏起来,为用户提供一个高层次的接口,使得系统更加易用,同时也隐藏了具体的实现,这样即使具体的子系统发生了变化,用户也不会感知到。

3.外观模式使用场景

  • 构建一个有层次结构的子系统时,使用外观模式定义子系统中每层的入口点,如果子系统之间是相互依赖的,则可以让他们通过外观接口进行通信,减少子系统之间的依赖关系。
  • 子系统往往会因为不断的重构演化而变得越来越复杂,大多数的模式使用时也会产生很多很小的类,这给外部调用他们的用户程序带来了使用的困难,我们可以使用外观类提供一个简单的接口,对外隐藏子系统的具体实现并隔离变化。
  • 当维护一个遗留的大型系统时,可能这个系统已经非常难以维护和拓展,但因为它含有重要的功能,新的需求必须依赖于它,则可以使用外观类,来为设计粗糙或者复杂的遗留代码提供一个简单的接口,让新系统和外观类交互,而外观类负责与遗留的代码进行交互。

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

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

相关文章

2279. 网络战争(最小割,01分数规划,二分)

活动 - AcWing 给出一个带权无向图 G(V,E),每条边 e 有一个权 we。 求将点 s 和点 t 分开的一个边割集 C,使得该割集的平均边权最小,即最小化: ∑(e∈C)we/|C| 注意: 边割集的定义与最小割中的割边的集合不同。在本…

面试redis篇-10Redis集群方案-主从复制

在Redis中提供的集群方案总共有三种: 主从复制哨兵模式分片集群主从复制 单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。 主从数据同步原理 Replication Id:简称replid,是数据集的标记,id一致则说明是同一数据集。每…

在linux下配置网桥透明模式防火墙

在 Linux 下配置网桥透明模式防火墙,您可以使用 iptables 或者 nftables 来实现。下面是一个基本的示例,假设您已经有一个网桥 br0,并且想要在网桥上应用透明防火墙规则。 安装必要的工具: sudo apt update sudo apt install brid…

mybatis架构

分为三层:接口层、数据处理层、框架支撑层 那么展开解释每层职责 1.接口层:包含新增、删除、查询、修改接口。其调用方式大致分为两种:一种是基于statementId,一种是基于Mapper接口。另外还维护配置信息的接口 2.数据处理层&am…

Java SpringBoot 创建项目工程输出 Hello World

Java SpringBoot 创建项目工程输出 Hello World 1、新建项目 2、创建 controller 3、编写 Hello World 代码 package com.zhong.demo01.controller;import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.Res…

本地项目如何上传到gitee

文章目录 一、在gitee上新建远程仓库二、初始化本地仓库三、执行git命令上传代码 一、在gitee上新建远程仓库 仓库名称必填,路径自动跟仓库名称保持一致 解释说明: 仓库名称:必填,每个仓库都需要有一个名称,同一个码…

Armbian 23.11(Ubuntu 22.04)安装glances不显示docker容器状态解决办法

引流关键词: debian 系统环境信息 注意!这里只是交代!具体情况无需与我一致! 命令输出cat /proc/versionLinux version 6.6.2-edge-rockchip64 (armbiannext) (aarch64-linux-gnu-gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0, …

【Leetcode】150. 逆波兰表达式求值

今天做了一道leetcode,题目不算难,基本就是stack的入栈出栈,但我看了一圈别人的代码,感觉不够优雅,所以我想分享一下自己的写法,主要就是用Map和BiFunction优化4个if else Java中,函数是能以对…

kubectl 命令行管理K8S

目录 陈述式资源管理方式 介绍 命令 项目的生命周期 创建 kubectl create命令 发布 kubectl expose命令 更新 kubectl set 回滚 kubectl rollout 删除 kubectl delete 陈述式资源管理方式 介绍 1.kubernetes 集群管理集群资源的唯一入口是通过相应的方法…

2024年用AI自动直播有效果吗?

在如今全民直播的时代,做短视频和直播已经成为多数企业、实体店必备的技能之一,全国各个头部的品牌,都在纷纷加码直播,甚至已经开启直播矩阵的体系,另外中小型商家也在思考,如何通过抖音直播,让…

量子前沿:美国计算社区联盟CCC发布量子计算进展最新研报!

内容来源:量子前哨(ID:Qforepost) 编辑丨慕一 编译/排版丨沛贤 深度好文:1800字丨12分钟阅读 近日,美国计算社区联盟 (CCC) 发布了过去五年量子计算进展的最新报告。CCC还分享了美国东北大学库里计算机科…

XGB-12:在 Kubernetes 上进行分布式 XGBoost 训练

通过 Kubeflow XGBoost Training Operator 支持在 Kubernetes 上进行分布式 XGBoost 训练和批量预测。 操作步骤 为在 Kubernetes 集群上运行 XGBoost 作业,执行以下步骤: 在 Kubernetes 集群上安装 XGBoost Operator。 XGBoost Operator 旨在管理 XGB…

从零开始学Spring Boot系列-Hello World

欢迎来到从零开始学Spring Boot的旅程!我们将从一个非常基础但重要的示例开始:创建一个简单的Spring Boot应用程序,并输出“Hello World”。 1. 环境准备 首先,确保你的开发环境已经安装了以下工具: Java Development …

word、wps插入参考文献

word 首先为参考文献自定义一个编号列表,开始->有序编号->定义新的编号格式,如下图所示: 在输入编号的格式中输入编号列表的形式,然后输入1;将编号样式改为1,2,3形式,不然就会…

dbt-core中的模型

在dbt中,模型(model)是核心概念之一,它代表了一个或多个SQL查询,这些查询定义了如何从源数据转换和构建目标数据表。除了SQL模型外,还有一个python模型,这里后面再进行探索. 以下是一些关于dbt模型的主要概念和注意事…

趣学贝叶斯定理:贝叶斯定理的先验概率、似然和后验概率(2)

4. 比较非归一化的后验概率 首先,我们需要求出两个后验概率的比值 P ( D ∣ H 1 ) P ( D ∣ H 2 ) \frac{P(D|H1)}{P(D|H2)} P(D∣H2)P(D∣H1)​ 接下来,用贝叶斯定理将其中的每一项都展开。 所以这个后验概率比值告诉我们,在不知道P(D)的…

PostgreSQL 与MySQL 对比使用

一、前言 博主的系统既有 用到MySQL 也有用到PostgreSQL ,之所以用到这两种数据库,主要是现在都是国产替代,虽然说这两款数据库也不是国产的,但是相对开源,oracle是不让用了。所以现在使用比较多的就是这两个关系型数据…

Java中文乱码问题几种常见的解决方法

Java中文乱码问题通常是因为字符编码不一致导致的。以下是几种常见的解决方法: 1. **设置JVM编码**:在启动Java程序时,可以通过-Dfile.encodingUTF-8参数来指定JVM使用的字符编码为UTF-8。例如: shell java -Dfile.encodin…

基于长短期神经网络的路径跟踪,基于长短期神经网络的路径预测

目录 背影 摘要 LSTM的基本定义 LSTM实现的步骤 基于长短期神经网络的路径跟踪,基于长短期神经网络的路径预测 MATALB代码:基于长短期神经网络的路径跟踪,基于长短期神经网络的路径预测(代码完整,数据齐全)资源-CSDN文库 https://download.csdn.net/download/abc9918351…

Docker 命令 K8S 共享卷

目录 镜像VS容器 docker常用命令 docker ps -a docker images docker build -t docker run docker rm {containerid} docker rmi {imageid} Docker Compose 服务编排 docker-compose 常用命令 K8S Pod Kubernetes 中的 Pod: K8S共享卷 K8S跨Pod实…