(四) python门面模式

文章目录

  • 4.1 结构型设计模式
    • 4.1.1 简介
    • 4.1.2 常见的几种结构型设计模式
  • 4.2 理解门面设计模式
    • 4.2.1 门面设计模式概述
    • 4.2.2 门面设计模式的作用
  • 4.3 UML类图
    • 4.3.1 门面
    • 4.3.2 系统
    • 4.3.3 客户端
  • 4.4 门面模式的代码实现
    • 4.4.1 场景:
    • 4.4.2 python实现
  • 4.5 原理:最少知识原则
  • 4.6 门面模式的优缺点
    • 4.6.1 门面模式优点
    • 4.6.2 门面模式缺点

门面模式属于结构型设计模式的一种,下面我们先了解一下结构型设计模式:

4.1 结构型设计模式

4.1.1 简介

● 结构型模式描述如何将对象和类组合成更大的结构。
● 结构型模式是一种能够简化设计工作的模式,因为它能够找出更简单的方法来认识或表示实体之间的关系。
● 在面向对象世界中,实体指的是对象或类。
● 类模式可以通过继承来描述抽象,从而提供更有用的程序接口,而对象模式则描述了如何将对象联系起来从而组合成更大的对象。结构型模式是类和对象模式的综合体。

4.1.2 常见的几种结构型设计模式

下面给出结构型设计模式的几个例子。你会注意到,它们都是通过对象或类之间的交互来实现更高级的设计或架构目标的。
● 适配器模式:将一个接口转换成客户希望的另外一个接口。它试图根据客户端的需求来匹配不同类的接口。
● 桥接模式:该模式将对象的接口与其实现进行解耦,使得两者可以独立工作。
● 装饰器模式:该模式允许在运行时或以动态方式为对象添加职责。我们可以通过接口给对象添加某些属性。

4.2 理解门面设计模式

4.2.1 门面设计模式概述

门面(facade)在隐藏内部系统复杂性的同时,为客户端提供了一个接口,以便它们可以非常轻松地访问系统。下面,我们以店主为例进行介绍。
现在,假设你要到某个商店去买东西,但是你对这个商店的布局并不清楚。通常情况下,你会去找店主,因为店主对整个商店都很清楚。只要你告诉他/她要买什么,店主就会把这些商品拿给你。这不是很容易吗?顾客不必了解店面的情况,可以通过一个简单的接口来完成购物,这里的接口就是店主。

4.2.2 门面设计模式的作用

门面设计模式实际上完成了下列事项
● 它为子系统中的一组接口提供一个统一的接口,并定义一个高级接口来帮助客户端通过更加简单的方式使用子系统。
● 门面所解决问题是,如何用单个接口对象来表示复杂的子系统。实际上,它并不是封装子系统,而是对底层子系统进行组合。
● 它促进了实现与多个客户端的解耦。

4.3 UML类图

在这里插入图片描述

就像你在UML图中看到的那样,这个模式有3个主要的参与者:
● 门面:门面的主要责任是,将一组复杂导致系统封装起来,从而为外部世界提供一个舒适的外观。
● 系统:这代表一组不同的子系统,使整个系统混杂在一起,难以观察或使用
● 客户端:客户端与门面进行交互,这样就可以轻松地与子系统进行通信并完成工作了。不必担心系统的复杂性。
下面,我们将会从数据结构的角度进一步介绍这3个主要参与者。

4.3.1 门面

以下几点可以帮助我们更好地理解门面
● ·它是一个接口,它知道某个请求可以交由哪个子系统进行处理。
● 它使用组合将客户端的请求委派给相应的子系统对象。例如,如果客户端正在了解哪些工作已完成,则不需要到各个子系统去,相反,它只需要联系完成工作的接口(门面)就可以了

4.3.2 系统

在门面的世界里,系统就是执行以下操作的实体
● 它实现子系统的功能,同时,系统由一个类表示。理想情况下,系统应该由一组负责不同任务的类来表示。
● 它处理门面对象分配的工作,但并不知道门面,而且不引用它。
例如,当客户端向门面请求某项服务时,门面会根据服务的类型来选择提供该服务的相应子系统。

4.3.3 客户端

以下是我们对客户端的描述
● 客户端是实例化门面的类
● 为了让子系统完成相应的工作,客户端需要向门面提出请求。

4.4 门面模式的代码实现

4.4.1 场景:

假设你要在家中举行一场婚礼,并且由你来张罗这一切。这真是一个艰巨的任务。你必须预订一家酒店或场地,与餐饮人员交代酒菜、布置场景,并安排背景音乐。
之前,你可能需要自己搞定一切,例如找相关人员谈话、与他们进行协调、敲定价格等。那么现在你就很轻松了,你可以直接去找会务经理,让他为你处理这些事情。会务经理负责跟各个服务提供商交涉,并为你争取最优惠的价格。

4.4.2 python实现

#!/usr/bin/env python
# -*- coding: UTF-8 -*-# 门面类 会务经理:通过组合创建子系统的对象
class EventManager(object):def __init__(self):print("Event Manager:: Let me talk to the folks\n")def arrange(self):self.hotelier = Hotelier()self.hotelier.bookHotel()  # 定酒店self.florist = Florist()self.florist.setFlowerRequirements()  # 定花self.caterer = Caterer()self.caterer.setCuisine()  # 准备宴席self.musician = Musician()self.musician.setCuisine()# 门下调用的子系统1
class Hotelier(object):def __init__(self):print("Arranging the Hotel for Marriage? --")def __isAvailable(self):print("Is the Hotel free for the event on given day?")return Truedef bookHotel(self):if self.__isAvailable():print("Registered the Booking\n\n")# 门下调用的子系统
class Florist(object):def __init__(self):print("Flower Decorations for the Event? --")def setFlowerRequirements(self):print("Carnations,Roses and Lilies would be used for Decorations \n")# 门下调用的子系统
class Caterer(object):def __init__(self):print("Food Arrangements for the Event --")def setCuisine(self):print("Chinese & Continental Cuisine to be served\nin")# 门下调用的子系统
class Musician(object):def __init__(self):print("Musical Arrangements for the Marriage --")def setCuisine(self):print("Chinese & Continental Cuisine to be served\n\n")# 客户端类,调用门面的一方
class You(object):def __init__(self):print("开始筹备一场婚礼!!!")def askEventManager(self):print("联系门面类,让其来组织各项事务\n\n")em = EventManager()em.arrange()def __del__(self):print("筹备结束!!!")# 调用
you = You()
you.askEventManager()

4.5 原理:最少知识原则

门面模式背后的设计原理就是最少知识原则,它指导我们设计系统时要减少对象之间的交互,就像跟你亲近的只有某几个朋友那样。实际上,它意味着:
● 在设计系统时,对于创建的每个对象,都应该考察与之交互的类的数量,以及交互的方式;
● 遵循这个原则,就能够避免创建许多彼此紧密耦合的类的情况;
● 如果类之间存在大量依赖关系,那么系统就会变得难以维护。如果对系统中的任何部分进行修改,都可能导致系统的其他部分被无意改变,这意味着系统会退化是应该坚决避免的。

4.6 门面模式的优缺点

4.6.1 门面模式优点

由于门面模式提供了简化的接口,这使得客户端不必担心子系统的复杂性;

4.6.2 门面模式缺点

门面提供了一个简化的接口供客户端与子系统交互。本着提供简化接口的精神,应用可能会建立多个不必要的接口,这就增加了系统的复杂性并且降低了运行时的性能。

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

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

相关文章

Compose for iOS:kotlin 与 swift 互操作

前言 类似于 Android 上的 compose,在 iOS 上的 compose 同样支持嵌套显示 compose UI 和 swiftUI 或是 uikit 。 但是不同于 Android 原生就是使用 kotlin 作为开发语言,iOS 的开发语言是 swift 或者 object-c 。虽然大多数业务逻辑都可以直接使用 ko…

渲染(iOS渲染过程解析)

渲染 渲染原理 一个硬核硬件科普视频 CPU和GPU CPU(Central Processing Unit):现代计算机整个系统的运算核心、控制核心,适合串行计算。GPU(Graphics Processing Unit):可进行绘图运算工作的…

安防音频接口选型的高性能国产芯片分析

在人工智能兴起之后,安防市场就成为了其全球最大的市场,也是成功落地的最主要场景之一。对于安防应用而言,智慧摄像头、智慧交通、智慧城市等概念的不断涌现,对于芯片产业催生出海量需求。今天,我将为大家梳理GLOBALCH…

springboot_3.2_freemark_基础环境配置

springboot_3.2_freemark_基础环境配置 一、前言二、环境三、相关资料四、目标五、默认配置项六、构建springboot 3.2项目6.1 pom.xml 内容:6.2 启动类6.3 添加ftlh模板6.4 controller内容6.5 bootstrap.yml配置 七、总结 一、前言 FreeMarker 是一款模板引擎&…

Linux——缓冲区与实现C库的fopen,fwrite,fclose

目录 一.缓冲区 1缓冲区的概念 2.缓冲区存在的意义 3.缓冲区刷新策略 4.什么是刷新? C语言的缓冲区在哪里? ​编辑 仿写C库里的fopen,fclose,fwrite。 mystdio.h mystdio.c main.c(向文件中写入20次msg) 一.缓冲区 1…

b站pwn的学习总结

写的很乱 1.c语言的运行过程 了解了c语言需要经过以上2个过程(编译和汇编),才能让机器按指令运行。机器只能听得懂机器码,所以要“汇编”。 那问题就来了,“编译”这个动作有啥用,c语言这种高级语言&…

玩转大数据10:深度学习与神经网络在大数据中的应用

目录 1. 引言:深度学习和神经网络在大数据中的重要性和应用场景 2. 深度学习的基本概念和架构 3. Java中的深度学习框架 3.1. Deeplearning4j框架介绍及Java编程模型 3.2. DL4J、Keras和TensorFlow的集成 4. 大数据与深度学习的结合 4.1. 大数据与深度学…

电脑端同时登录多个微信

1、建立一个txt文件 2、右击微信查看应用的属性,记录文件的位置 3、将步骤二得到的路径按照下方的格式输入到步骤一的文本中 4、保存之后将文本后缀名的.txt改成.bat 5、在未登录微信的情况下,双击即可得到两个微信登录窗口

Python高级算法——回溯法(Backtracking)

Python中的回溯法(Backtracking):高级算法解析 回溯法是一种通过尝试所有可能的解来找到问题解的算法设计方法。它通常应用于组合问题、排列问题、子集问题等。在本文中,我们将深入讲解Python中的回溯法,包括基本概念…

解决oracle.sql.TIMESTAMP序列化转换失败问题 及 J2EE13Compliant原理

目录 报错现象报错内容处理方法Oracle驱动源码总结 报错现象 oracle表中存在TIMESTAMP类型的列时,jdbc查出来做序列化时报错 报错内容 org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframewo…

x86和ARM中配置无线网SSID和PASSWORD

提供一个可行的方法 1.准备文件 hostapd.conf :是用户控件的守护进程用于无线接入点(AP)和授权服务器(authentication servers),存放路径:/etc/hostapd/hostapd.conf interfacewlp5s0 drivernl80211 chan…

Java中多线程中 synchronized 锁升级的原理是什么?

Java中多线程中 synchronized 锁升级的原理是什么? 在 Java 中,synchronized 锁的升级是指在不同的场景下,锁的性能优化。Java 的锁有多个状态,主要包括偏向锁、轻量级锁和重量级锁。 偏向锁:当只有一个线程访问同步块…

acwing算法提高之动态规划--背包模型(三)

目录 1 基础知识2 模板3 工程化 1 基础知识 暂无。。。 2 模板 暂无。。。 3 工程化 题目1:潜水员。 解题思路:DP。 状态定义f[i][j][k]:从前i个物品中选,氧气至少为j,氮气至少为k的最小方案数。 状态转移&…

解决idea 通过build project 手动触发热部署失败

在debug运行项目的过程中,并且保证(不添加方法,不修改方法名)一定的规则的情况下,可以通过build project 来手动热部署项目,也就是会交换class文件与resouces文件。 设置项 Edit Configurations Modify Op…

计算机图形学理论(1):建模基础

本系列根据国外一个图形小哥的讲解为本,整合互联网的一些资料,结合自己的一些理解。 场景的组成部分 场景相当于一个或多个模型的集合。模型包含以下内容: 结构描述:几何形状,如顶点、纹理坐标等表面描述&#xff1a…

Vue3中的defineModel

目录 一、vue3的defineModel介绍 二、defineModel使用 (1)在vite.config.js中开启 (2)子组件 (3)父组件 一、vue3的defineModel介绍 为什么要使用到defineModel呢?这里有这样一种场景&…

“快速排序:一种美丽的算法混沌”(1.hoare)

欢迎来到我的博客!在今天的文章中,我将采用一种独特且直观的方式来探讨我们的主题:我会使用一幅图像来贯穿整篇文章的讲解。这幅精心设计的图表不仅是我们讨论的核心,也是一个视觉辅助工具,帮助你更深入地理解和掌握本…

学习深度强化学习---第2部分----RL动态规划相关算法

文章目录 2.1节 动态规划简介2.2节 值函数与贝尔曼方程2.3节 策略评估2.4节 策略改进2.5节 最优值函数与最优策略2.6节 值迭代与策略迭代2.7节 动态规划求解最优策略 本部分视频所在地址:深度强化学习的理论与实践 2.1节 动态规划简介 态规划有两种思路&#xff1…

前端 Web Workers 简介

简介 以前我们总说,JS 是单线程没有多线程,当 JS 在页面中运行长耗时同步任务的时候就会导致页面假死影响用户体验,从而需要设置把任务放在任务队列中;执行任务队列中的任务也并非多线程进行的,然而现在 HTML5 提供了…

App备案、ios备案Bundle ID查询、公钥信息、SHA-1值

App备案、ios备案Bundle ID查询、公钥信息、SHA-1值 Bundle ID这个就不说了,都知道是啥,主要说公钥信息和SHA-1值的获取 打开钥匙串访问,找到当前需要备案App的dis证书,如下: #####右键点击显示简介 #####可以看…