设计模式(八)外观模式

相关文章
设计模式系列

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.hqwc.cn/news/493407.html

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

相关文章

【数据结构与算法】动态规划法解题20240227

动态规划法 一、什么是动态规划二、动态规划的解题步骤三、509. 斐波那契数1、动规五部曲: 四、70. 爬楼梯1、动规五部曲: 五、746. 使用最小花费爬楼梯1、动规五部曲: 一、什么是动态规划 动态规划,英文:Dynamic Pro…

qtcreator-ros 安装记录

文章目录 ros_qtc_pluginros_qt_demo参考链接ros_qtc_plugin ROS Qt Creator 插件是专门为 ROS 开发的,通过简化任务和为 ROS 工具创建集中位置来提高开发人员的效率。由于它建立在Qt Creator平台之上,用户可以访问其所有现有功能,例如:语法高亮,代码索引,编辑器(C++,…

Python 实现 CCI 指标计算:股票技术分析的利器系列(8)

Python 实现 CCI 指标计算:股票技术分析的利器系列(8) 介绍算法解释 代码rolling函数介绍核心代码计算 CCIapply 函数abs 函数 完整代码 介绍 CCI指标的数值波动通常在一个区间内,常见的情况是在-100到100之间。当CCI超过100时&a…

学习 LangChain 的 LCEL

学习 LangChain 的 LCEL 0. 引言1. 基本示例:提示模型输出解析器​1-1. Prompt​1-2. Model1-3. Output parser1-4. Entire Pipeline 0. 引言 LCEL(LangChain Expression Language) 可以轻松地从基本组件构建复杂的链,并支持开箱即用的功能,…

基于springboot+vue的精准扶贫管理系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

Spring Bean 相关注解

目录 Autowired Component,Repository,Service, Controller RestController Scope Configuration Autowired 自动导入对象到类中,被注入进的类同样要被 Spring 容器管理比如:Service 类注入到 Controller 类中。 Service public class UserService …

「Qt Widget中文示例指南」如何实现文档查看器?(一)

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。 文档查看器是一个显…

IDEA配置有道翻译插件

目录 安装Translation插件有道云配置翻译APIIDEA配置有道翻译引擎 关于IDEA Translation插件中有道智云(有道翻译)应用ID,密钥申请教程 安装Translation插件 File -> Settings ->Plugins ->搜索Translation ->insatll 有道云…

Ubuntu上Jenkins自动化部署Gitee上SpringBoot项目

文章目录 安装安装JDK安装Maven安装GitNodeJS安装(可选)安装Jenkins 配置Jenkins为Jenkins更换插件源设置jenkins时区安装插件全局工具配置添加Gitee凭证Gitee项目配置 部署后端1.新建任务2.配置源码管理3.构建触发器4.到Gitee中添加WebHook5.构建环境6.…

RISC-V指令集之RV32C

RISC-V指令集之RV32C 1 指令格式2 RV32C的指令 本文属于《 RISC-V指令集基础系列教程》之一,欢迎查看其它文章。 1 指令格式 RV32C(压缩指令)的意义: RV32C基于32位寄存器的RISC-V架构,同时增加了压缩指令集&#xf…

RV64 - 64位地址指令

RV64 - 64位地址指令 1 RV64G介绍2 RV64G增加的指令 本文属于《 RISC-V指令集基础系列教程》之一,欢迎查看其它文章。 1 RV64G介绍 RV32I RV32M RV32A RV32F RV32D RV32G,那么RV32G 指令的64 位版本 – RV64G 指令,其示意图&#xff0…

300分钟吃透分布式缓存-08讲:MC系统架构是如何布局的?

系统架构 我们来看一下 Mc 的系统架构。 如下图所示,Mc 的系统架构主要包括网络处理模块、多线程处理模块、哈希表、LRU、slab 内存分配模块 5 部分。Mc 基于 Libevent 实现了网络处理模块,通过多线程并发处理用户请求;基于哈希表对 key 进…