设计模式学习笔记——结构型模式

文章目录

    • 适配器模式 Adapter
      • 适用场景
      • UML
    • 桥接模式 Bridge
      • 适用场景
      • UML
    • 组合模式 Composite
    • 装饰模式 Decorator
    • 外观模式 Facade
    • 享元模式 Flyweight
    • 代理模式 Proxy

适配器模式 Adapter

适用场景

  1. 希望使用某个类, 但是其接口与其他代码不兼容时, 可以使用适配器类。

UML

结构一:
适配器实现了其中一个对象的接口, 并对另一个对象进行封装。

«interface»
ClientInterface
+method(data)
Adapter
-adaptee Service
+method(date)
Service
+serviceMethod(specialData)
Client

结构二:
有些编程语言支持多继承,比如C++。适配器同时继承两个对象的接口,适配功能在重写的方法中完成。 最后生成的适配器可替代已有的客户端类进行使用。
eg:

Adapter::method() {specialData = convertToServiceFormat(data);return serviceMethod(specialData);
}
ExistingClass
+method(data)
Adapter
-adaptee Service
+method(date)
Service
+serviceMethod(specialData)
Client

通过上面的分析可以看出来,适配器模式,是将某个对象封装到Adapter的内部,然后为被封装对象提供不同的接口

桥接模式 Bridge

适用场景

  1. 如果你希望在几个独立维度上扩展一个类, 可使用该模式。
  2. 如果你想要拆分或重组一个具有多重功能的庞杂类 (例如能与多个数据库服务器进行交互的类), 可以使用桥接模式。
  3. 如果你需要在运行时切换不同实现方法, 可使用桥接模式。
    案例:
    一个Shape类,派生出了Circle类和Square类。你希望对这样的类层次结构进行扩展以使其包含颜色, 所以你打算创建名为 红色Red和 蓝色Blue的形状子类。由于你已有两个子类, 所以总共需要创建四个类才能覆盖所有组合, 那就得派生出红色Circle+红色Square+蓝色Circle+蓝色Square。如果后续你想新增一个三角形形状,你需要增加两个子类,即红色三角形和蓝色三角形,再之后如果你想增加一个颜色,你需要增加三个子类。子类的个数会呈指数增长。

UML

Client
Abstraction
-i Implemetation
+feature1()
+feature2()
«interface»
Implementation
+method1()
+method2()
+method3()
RefinedAbstraction
+featureN()
ConcreteImplementation
  1. 抽象部分Abstraction 提供了高层控制逻辑,实际工作依赖于底层的实现Implementation。比如GUI程序的底层实际是调用了操作系统的API,此处的抽象部分就相当于GUI程序的主逻辑,底层的实现部分就相当于操作系统的API。
Abstraction::feature1(){...i.method1();...
}
Abstraction::feature2(){...i.method2();i.method3();
}
  1. 实现部分Implementation声明了通用的接口,用于为高层提供功能。
  2. 具体实现Concrete Implementation里包括了特定平台的代码
  3. 精确抽象Refined Abstraction提供控制逻辑的变体(featureN),与父类一样,也是依赖实现的接口与实现交互。
  4. 客户端Client一般负责将某个抽象和某个实现连接起来,然后调用抽象的方法。abstraction.feature1();
    像这样将高层抽象和具体实现分离开,两个部分可以分别演进而不会对另一方产生影响。至于为什么叫Bridge模式,大概主要是因为二者之间通过聚合关系关联到一起,这个聚合关系,就像是二者沟通的桥梁。

组合模式 Composite

将对象集合封装到Composite内部,为单元素和集合元素提供相同的接口,便于处理树形的逻辑结构。

装饰模式 Decorator

将对象封装到Decorator内部,为对象提供一个增强的接口

外观模式 Facade

将子系统细节封装到Facade内部,为子系统提供一个简化的接口

享元模式 Flyweight

将对象中不易变的大成员提取出来单独存储,而在对象内部只存储一个指向大成员的指针或者引用,以达到缩减内存占用的目的。

代理模式 Proxy

将对象封装到Proxy内部,为对象提供一个和对象相同的接口

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

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

相关文章

rust如何在类中保存一个闭包,它可以捕获类自己?

首先这个为什么在 Rust 中这么难实现? 我们得承认一个残酷的现实:Rust 不是 C。在 C 中,可以随心所欲地使用引用,编译器不会过多干涉。但在 Rust 中,编译器会像严厉的监管者一样盯着我们的每一个动作,生怕…

黑马跟学.苍穹外卖.Day04

黑马跟学.苍穹外卖.Day04 苍穹外卖-day04课程内容1. Redis入门1.1 Redis简介1.2 Redis下载与安装1.2.1 Redis下载1.2.2 Redis安装 1.3 Redis服务启动与停止1.3.1 服务启动命令1.3.2 客户端连接命令1.3.3 修改Redis配置文件1.3.4 Redis客户端图形工具 2. Redis数据类型2.1 五种常…

SOLID原则学习,开闭原则

文章目录 1. 定义2. 开闭原则的详细解释3. 实现开闭原则的方法4. 总结 1. 定义 开闭原则(Open-Closed Principle,OCP)是面向对象设计中的五大原则(SOLID)之一,由Bertrand Meyer提出。开闭原则的核心思想是…

filebeat、kafka

elk的架构 es数据库:非关系型数据库,json格式 logstash:收集日志 kibana:图形化的工具 ↓ 以上三种结合起来即为日志收集系统 filebeat 作用:filebeat是一款轻量级的日志收集工具,不依赖java环境&…

Qt重写webrtc的demo peerconnection

整个demo为: 可以选择多个编码方式: cmake_minimum_required(VERSION 3.5)project(untitled LANGUAGES CXX) set(CMAKE_CXX_STANDARD 20) set(CMAKE_INCLUDE_CURRENT_DIR ON)set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON)set(CMA…

【Notepad++】Notepad++如何删除包含某个字符串所在的行

Notepad如何删除包含某个字符串所在的行 一,简介二,操作方法三,总结 一,简介 在使用beyoundcompare软件进行对比的时候,常常会出现一些无关紧要的地方,且所在行的内容是变化的,不方便进行比较&…

python无需验证码免登录12306抢票 --selenium(2)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 [TOC](python无需验证码免登录12306抢票 --selenium(2)) 前言 提示:这里可以添加本文要记录的大概内容: 就在刚刚我抢的票:2025年1月8日…

CSS 盒模型

盒模型 CSS盒模型是网页布局的核心概念之一,它描述了网页元素的物理结构和元素内容与周围元素之间的关系。根据W3C规范,每个HTML元素都被视为一个矩形盒子,这个盒子由以下四个部分组成: 内容区(Content area&#xff…

Kivy App开发之UX控件Slider滑块

在app中可能会调节如音量,亮度等,可以使用Slider来实现,该控件调用方便,兼容性好,滑动平稳。在一些参数设置中,也可以用来调整数值。 支持水平和垂直方向,可以设置默认值,最小及最大值。 使用方法,需用引入Slider类,通过Slider类生成一个滑块并设置相关的样式后,再…

WPF的自定义控件控件学习

引入自定义控件 <controls:Intellibox Style"{StaticResource ListSearch-SearchIntellibox}" Width"95" Margin"0,3" MaxResults"200" …

MySQL常用命令之汇总(Summary of Commonly Used Commands in MySQL)

MySQL常用命令汇总 简介 ‌MySQL是一个广泛使用的开源关系型数据库管理系统&#xff0c;由瑞典的MySQL AB公司开发&#xff0c;现属于Oracle公司。‌ MySQL支持SQL&#xff08;结构化查询语言&#xff09;&#xff0c;这是数据库操作的标准语言&#xff0c;用户可以使用SQL进…

【含开题报告+文档+PPT+源码】基于springboot的农贸菜市场租位管理系统的设计与实现

开题报告 随着信息技术的快速发展和普及&#xff0c;信息化管理已成为各行业提升运营效率和服质量的重要手段。农贸菜市场作为城市生活的重要组成部分&#xff0c;其管理效率和服务水平直接关系到市民的日常生活体验。传统的农贸菜市场租位管理方式往往存在信息不对称、管理效…

华为路由器、交换机、AC、新版本开局远程登录那些坑(Telnet、SSH/HTTP避坑指南)

关于华为设备远程登录配置开启的通用习惯1、HTTP/HTTPS相关服务 http secure-server enablehttp server enable 2、Telnet服务telnet server enable3、SSH服务stelnet server enablessh user admin authentication-type password 「模拟器、工具合集」复制整段内容 链接&…

Vue 2 深度剖析:从理论到实战的全面指南

Vue 2 深度剖析&#xff1a;从理论到实战的全面指南 一、引言 在当今前端开发领域&#xff0c;Vue.js 2 版本以其简洁优雅、易于上手且高效强大的特性&#xff0c;广泛应用于各类项目之中&#xff0c;成为众多开发者的心头好。无论是小型创业公司的快速迭代项目&#xff0c;还…

【论文阅读-思维链的构造方法02】4.1.2 Automatic Construction-02

提示1&#xff1a;本篇博客中涉及4篇相关论文&#xff0c;预计阅读时间10分钟&#xff0c;望各位友友耐心阅读&#xff5e; 提示2&#xff1a;本篇所有涉及的论文已打包发布&#xff0c;不需要任何积分即可下载&#xff0c;指路 --> 论文集下载地址 大模型技术-思维链CoT …

【GIt原理与使用】Git远程仓库

一、理解分布式版本控制系统 我们目前所说的所有内容&#xff08;工作区&#xff0c;暂存区&#xff0c;版本库等等&#xff09;&#xff0c;都是在本地&#xff01;也就是在你的笔记本或者计算机上。而我们的 Git 其实是分布式版本控制系统&#xff01;什么意思呢&#xff1f…

【后端面试总结】设计一个分布式锁需要考虑哪些东西

分布式锁是我们在分布式场景中经常用到的一种技术&#xff0c;在后端面试中也是出镜率很高&#xff0c;那么我们设计分布式锁的时候应该从那几方面去考虑呢 实现分布式锁需要考虑的点 设置超时时间 设置超时时间的目的是为了避免这个场景&#xff1a;进程A拿了锁&#xff0c…

javascript e.preventDefault() 的作用和用法

&#x1f4da; e.preventDefault() 的作用和用法 ✅ e.preventDefault() 是一个常用的 JavaScript 方法&#xff0c;用于 阻止事件的默认行为。它通常在 表单提交、链接跳转、右键菜单 等场景中使用&#xff0c;防止浏览器执行特定的默认操作。 &#x1f50e; 1. 为什么使用 e…

如何在 Docker 中切换登录用户

在 Docker 中进行身份验证时&#xff0c;通常是使用 Docker Hub 或其他私有仓库。如果你希望在同一仓库地址上切换不同的用户进行登录&#xff0c;以下是详细的操作步骤。 1. 退出当前用户 首先&#xff0c;使用 docker logout 命令退出当前用户的登录状态。这个操作会清除 D…

力扣-数组-88 合并两个有序数组

解析 分别维护指向两个数组的指针&#xff0c;不断往后增加指针即可&#xff0c;主要是边界&#xff0c;然后时间复杂度是。 代码 class Solution { public:void merge(vector<int>& nums1, int m, vector<int>& nums2, int n) {vector <int> new…