(四) python门面模式

news2024/11/28 4:30:07

文章目录

  • 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 True

    def 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.coloradmin.cn/o/1286673.html

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

相关文章

【C++】动态内存管理——new和delete

这篇文章我们讲一下C的动态内存管理,从一个比较陌生的知识说起,我们知道,一个工程可以创建很多.c文件,我们如果定义一个全局变量,只要用extern声明一下,在每个文件都可以用。而用static修饰的全局变量只能在…

Vue Computed

小满,我的神! 视频链接 // 只读 const plusOne computed(() > count.value 1) // 可读可写 const plusOne computed({get: () > count.value 1,set: (val) > {count.value val - 1} }, { // 用于调试onTrack(e) {debugger},onTrigger(e) …

软件测试基础知识总结

之前有将基础的软件测试知识做了一个总结,但比较潦草,很多内容只是一笔带过,快到年底了,自己也有个写年终知识总结文档的计划,就将基础的理论知识重新整理一番。 有人问我,这些都是能搜索到的知识&#xf…

微信视频无法播放,快速进行格式转换方法

你是否遇到过这样的事情呢,朋友或者家人在电脑上用微信给你发的视频,在自己的微信上点开却无法播放。这种是什么原因造成的呢?是不是需要将这些无法播放的视频转换为微信支持的格式才行,那应该如何转换呢? 不要着急&a…

使用 PyWebCopy 在 Python 中克隆网页

更多资料获取 📚 个人网站:ipengtao.com PyWebCopy 是一个用于克隆网页内容的 Python 库,它允许用户从指定的 URL 复制整个网页并保存到本地。本文将介绍 PyWebCopy 的基本用法,以及如何克隆网页并保存网页内容到本地文件夹。 安…

QTableView用代码设置选中状态

背景: 个人笔记,欢迎探讨。 目的是实现用代码设置表格中的选中状态,比如选中某个单元格,或某行,某列。实际上只要能完成选中单元格,行和列都是单元格的集合,道理一样。 QTableWidget比QTable…

常用汇编指令集

寄存器 如上是OD展示的寄存器,逐条说明常用的寄存器和标志位含义: EIP:寄存器指向即将要执行的指令的地址(EIP中的地址,就是下一步要执行指令的地址) ESP:里面的内容永远指向堆栈的最顶端 EAX&…

青春挚爱-计算机

为什么选择计算机? 看到这个问题,不禁把镜头遥向十几年前的某个片刻。 一、梦想的种子 首先信仰技术是从小的梦想,比如科学家精神之启蒙,比如勇敢者探索之启蒙。 为什么课本中的科学家可以做到精忠报国,矢志不渝&…

Elasticsearch:什么是向量嵌入?

向量嵌入定义 向量嵌入 (vector embeddings) 是一种将单词、句子和其他数据转换为捕获其含义和关系的数字的方法。 它们将不同的数据类型表示为多维空间中的点,其中相似的数据点更紧密地聚集在一起。 这些数字表示可以帮助机器更有效地理解和处理这些数据。 单词和…

云原生的 CI/CD 框架tekton - Trigger(二)

上一篇为大家详细介绍了tekton - pipeline,由于里面涉及到的概念比较多,因此需要好好消化下。同样,今天在特别为大家分享下tekton - Trigger以及案例演示,希望可以给大家提供一种思路哈。 文章目录 1. Tekton Trigger2. 工作流程3…

【计算机系统基石与Linux进程管理深度解析】

​​​​​​​ 【本节重点】 认识冯诺依曼系统 操作系统概念与定位 深入理解进程概念,了解PCB 学习进程状态,学会创建进程,掌握僵尸进程和孤儿进程,及其形成原因和危害 1.冯诺依曼体系结构 我们常见的计算机,如…

App内存优化

一、内存优化介绍 1.背景介绍 内存是大问题但缺乏关注压实骆驼的最后一个稻草(堆栈溢出) 2.内存问题 内存抖动:锯齿状、GC导致卡顿内存泄露:可用内存减少、频繁GC内存溢出:OOM,程序异常 二、优化工具选…

【C语言】函数递归详解(二)

前言 在上一篇博客函数递归详解(一)中讲解了什么是递归,递归的思想及限制条件以及两个递归的例子,这一篇博客将讲解递归与迭代的关系。 递归与迭代 递归是一种很好的编程技巧,但是同很多技巧一样也是可能被误用的&…

api 网关

API网关 什么是网关? 微服务背景下,一个系统被拆分为多个服务,但是像安全认证,流量控制,日志,监控等功能是每个服务都需要的,没有网关的话,我们就需要在每个服务中单独实现&#x…

2023年【T电梯修理】考试总结及T电梯修理证考试

题库来源:安全生产模拟考试一点通公众号小程序 T电梯修理考试总结考前必练!安全生产模拟考试一点通每个月更新T电梯修理证考试题目及答案!多做几遍,其实通过T电梯修理证考试很简单。 1、【多选题】《特种设备安全法》规定&#x…

【2】PyQt创建窗口

1. 第一个PyQt窗口 from PyQt5.QtWidgets import QApplication,QWidget import sys# 1.创建应用程序 app QApplication(sys.argv)# 2.创建窗口 w QWidget()# 3.显示窗口 w.show()# 4.等待窗口停止 sys.exit(app.exec()) 执行代码,就会显示PyQt窗口: 2. PyQt模块简介 PyQt中…

基于SpringBoot的校园互助网站

简介 本系统分为三个角色,分别是普通用户和管理员、以及超级管理员,主要的功能模块有注册、登录、物品代购、快递代取、话题管理、任务管理、反馈管理、投诉管理、订单管理等功能模块。 项目 数据库 首页 登录 新增反馈 发布话题 发布任务 接单 我要投诉…

粒子群优化算法的实践

粒子群优化算法的实践 flyfish 粒子群优化算法(Particle Swarm Optimization,PSO)或者粒子群算法 红叉的地方是理想之地,这些粒子都想去,总结8个字是信息共享,个人决策。 上完图之后,上代码&a…

算法通关村——数论问题

数论是一个很重要的学科,覆盖领域极广,小到小学的智力问题,大到世界顶级科学家都一直在研究相关问题,因此其难度跨度非常大。在程序设计里 ,也经常会出现数论的问题,但是,这些一般都是比较基本的…

训练自己的YOLOv8姿态估计模型

在不断发展的计算机视觉领域,姿态估计作为一项关键创新脱颖而出,改变了我们理解视觉数据以及与视觉数据交互的方式。 Ultralytics YOLOv8 处于这一转变的最前沿,提供了一个强大的工具来捕捉图像中物体方向和运动的微妙之处。 NSDT工具推荐&am…