【愚公系列】软考中级-软件设计师 051-面向对象技术(设计模式-结构型)

举报
愚公搬代码 发表于 2024/02/24 17:47:31 2024/02/24
【摘要】 🏆 作者简介,愚公搬代码🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,51CTO博客专家等。🏆《近期荣誉》:2022年度博客之星TOP2,2023年度博客之星TOP2,2022年华为云十佳博主,2023年华为云十佳博主等。🏆《博客内容...

🏆 作者简介,愚公搬代码
🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,51CTO博客专家等。
🏆《近期荣誉》:2022年度博客之星TOP2,2023年度博客之星TOP2,2022年华为云十佳博主,2023年华为云十佳博主等。
🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
🏆🎉欢迎 👍点赞✍评论⭐收藏


🚀前言

🔎1.设计模式概念

设计模式是在软件设计领域中,为解决常见问题而被反复使用、被广泛认可的一种设计思想。它是一种经过实践验证的,被认为是最佳解决方案的经验总结,可以帮助开发人员快速高效地解决软件设计中的一些固有问题。

每一个设计模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心。这样,你就能一次又一次地使用该方案而不必做重复劳动。设计模式的核心在于提供了相关问题的解决方案,使得人们可以更加简单方便的复用成功的设计和体系结构。

设计模式具有以下特点:

特点 描述
在特定情况下被使用 设计模式并不是适用于所有场景的通用解决方案,而是在特定问题领域中被广泛使用的解决方案。
涉及多种设计元素 设计模式涉及到多个设计元素,包括类,对象,接口,继承,组合等等。
以面向对象方式进行设计 设计模式主要是针对面向对象编程而提出的,尽管也可以用于其他编程范式。
遵循设计原则 设计模式往往遵循一些设计原则,如单一职责原则、开闭原则、里氏替换原则等,以提高设计的可维护性、可扩展性和可重用性。

🔎2.设计模式分类

设计模式的四个基本要素:模式名称、问题(应该在何时使用模式)、解决方案(设计的内容)、效果(模式应用的效果)。

分为三类,创建型模式主要是处理创建对象,结构型模式主要是处理类和对象的组合,行为型模式主要是描述类或者对象的交互行为,具体如下(红色粗体记忆关键字表示常考必须记住的):

在这里插入图片描述

类型 描述
架构模式 - 软件设计中的高层决策,如C/S结构
- 反映了开发软件系统过程中所作的基本设计决策
设计模式 - 描述了一个在我们周围不断重复发生的问题和其解决方案的核心
- 提供了相关问题的解决方案,使得人们可以更加简单方便地复用成功的设计和体系结构
- 包含四个基本要素:模式名称、问题(应该在何时使用模式)、解决方案(设计的内容)、效果(模式应用的效果)
惯用法 - 最低层的模式,关注软件系统的设计与实现
- 通过特定的编程语言描述构件与构件之间的关系
- 每种编程语言都有自己的惯用法,即语言的特定模式(如C++中的引用计数)

🚀一、设计模式-结构型

结构型设计模式:关注如何将对象和类组合成更大的结构,以便更好地实现系统的整体结构。这些模式有助于解决对象之间的组合、接口和继承等关系,从而提高代码的可扩展性和可维护性。

🔎1.适配器模式(Adapter Pattern)

适配器模式允许不兼容的接口协同工作,就像使用电源适配器将外国电器插头适配到国内插座一样。适配器模式可以使不同的类一起工作。

例如,假设你有一台笔记本电脑,只有一个USB-C接口,但你的打印机只支持USB-A接口。这两个接口是不兼容的,无法直接连接。但你可以使用USB-C到USB-A的适配器来使它们兼容,将适配器插入笔记本电脑的USB-C接口,然后将打印机连接到适配器的USB-A接口。这样,笔记本电脑和打印机就可以一起工作了。

同样地,适配器模式在软件开发中也非常有用。当需要使用一个类,但其接口与现有系统不兼容时,可以创建一个适配器类,将这个类的接口适配到系统所需的接口,从而实现两者的协同工作。

🔎2.桥接模式(Bridge Pattern)

桥接模式分离了一个对象的抽象部分和具体部分,使它们可以独立地变化。这个模式就像一座桥,将两个独立的领域连接起来。

生活中的例子:

假设你想购买一辆汽车,汽车的品牌和颜色是两个独立的变化维度。桥接模式允许你将品牌和颜色抽象出来,使你可以轻松地组合不同品牌和颜色,例如创建一个红色的奥迪或蓝色的宝马。

举例说明:
当你购买一辆汽车时,你可以选择奥迪或宝马作为品牌,也可以选择红色或蓝色作为颜色。使用桥接模式,你可以将品牌和颜色分离出来,形成两个独立的维度。然后,你可以通过组合品牌和颜色选项,创建出不同的汽车组合,比如红色的奥迪或蓝色的宝马。这样,你可以根据自己的需求和喜好,创建出各种不同的汽车组合,而不需要为每个组合都定义一个具体的子类。

这个例子展示了桥接模式的优点,通过将变化的部分抽象出来,并通过桥接模式进行组合,使得对象的抽象和具体部分可以独立地进行变化。这样一来,你可以根据需要扩展品牌和颜色的选项,而不需要修改已有的代码。同时,这也避免了类的爆炸式增长,因为不同的品牌和颜色组合可以通过桥接模式进行动态创建,而不需要在类的继承体系中定义每个组合的具体子类。

🔎3.组合模式(Composite Pattern)

组合模式允许将对象组织成树状结构,使单个对象和组合对象都可以一致地对待。生活中的一个例子是在操作系统中,文件夹可以包含文件和其他文件夹,从而创建了一个树状的组织结构。在这个树状结构中,你可以对文件夹和文件执行相似的操作,例如复制、删除等。

例如,在Windows操作系统中,你可以创建一个名为"根文件夹"的文件夹,然后在它下面创建两个文件夹,分别命名为"文件夹A"和"文件夹B"。在"文件夹A"下,你可以创建两个文件,分别是"文件1"和"文件2"。同样地,在"文件夹B"下,你也可以创建两个文件,分别是"文件3"和"文件4"。

这样,你就创建了一个树状的组织结构,其中"根文件夹"是顶层容器,"文件夹A"和"文件夹B"是其子文件夹,“文件1”、“文件2”、“文件3"和"文件4"是其文件。在这个组织结构中,你可以对"根文件夹”、“文件夹A”、“文件夹B”、“文件1”、“文件2”、“文件3”、"文件4"执行相似的操作,例如复制、删除等。

通过组合模式,我们可以将多个文件夹和文件组织成一个文件系统树,从而方便地管理和操作这些对象。每个对象都可以被视为一个节点,可以通过遍历树的方式来处理整个文件系统。这种设计模式使得单个对象和组合对象具有了一致的接口,提高了代码的复用性和可扩展性。

🔎4.装饰器模式(Decorator Pattern)

装饰器模式允许动态地为对象添加新的功能,而无需修改其源代码。这种方式类似于家中不断添加新的家具或装饰来改善其外观和功能。

例如,假设你有一台智能音响,它可以播放音乐和接收语音指令。现在你想要扩展音响的功能,让它可以查询天气情况和进行音乐播放。使用装饰器模式,你可以添加新的语音助手技能来实现这些功能,而不需要修改音响的核心设计。换句话说,你可以在音响上添加一个天气查询装饰器,用于获取天气信息,并在音响上添加一个音乐播放装饰器,用于播放音乐。这样一来,你可以根据需要随时添加、删除或替换这些装饰器,而不会影响到音响的基本功能。

同样地,可以将这个概念应用到家居装饰中。你可以随时根据需要更换家具或添加新的装饰品来改善家居的外观和功能,而不需要对房屋结构进行修改。例如,你可以添加一个书架来增加存储空间,或者添加一幅画来增加艺术氛围。这些装饰品可以随时更换或移除,而不会对房屋的基本结构产生影响。

🔎5.外观模式(Facade Pattern)

外观模式提供了一个简化的接口,用于访问复杂系统中的一组接口。类比于建筑物的外立面,外观模式隐藏了系统内部的复杂结构,使得用户可以轻松地访问并使用系统。

举个生活中的例子来说明,我们可以看看计算机操作系统中的图形用户界面(GUI)。GUI为用户提供了一个易于使用的外观,隐藏了底层操作系统的复杂性。通过点击图标、打开应用程序等操作,用户可以在不了解操作系统内部工作原理的情况下轻松地使用电脑。就像在一座建筑物中,我们只需要看到外立面上的窗户、门等部分,而不需要了解建筑物内部的复杂结构。

🔎6.享元模式(Flyweight Pattern)

享元模式的目的是通过共享尽可能多的相似对象来最小化内存或计算开销。可以将其类比为在共享办公空间中租用一个工作区,多个人可以共享同一空间,从而减少资源浪费。

举个生活中的例子来说明:在图像编辑软件中,当多个图像元素共享相同的颜色或图案时,可以使用享元模式来减少内存占用。比如若多个图像元素需要使用相同的红色,那么可以创建一个红色的享元对象,并让这些图像元素引用同一个红色的享元对象。这样一来,就不需要为每个图像元素都存储一份相同的红色数据,从而减少了内存占用。

通过使用享元模式,可以有效地减少重复的数据存储,提高系统的性能和效率。

🔎7.代理模式(Proxy Pattern)

代理模式允许一个对象代表另一个对象进行控制访问。类似于聘请一个房产经纪人代表你购买房产的情况,代理模式可以控制对另一个对象的访问。

生活中的例子:

计算机网络中的代理服务器充当客户端和目标服务器之间的中间层,用于缓存、过滤或加速请求,以提供更好的访问控制和性能。例如,你想访问某个网站,但是该网站在你所在地区的访问速度很慢。这时,你可以通过设置代理服务器,让代理服务器帮助你从外地访问该网站,并将请求结果缓存下来,以提高访问速度。这样,你就可以通过代理服务器实现对该网站的更快访问,而不必直接与目标服务器进行通信。

在这里插入图片描述


🚀感谢:给读者的一封信

亲爱的读者,

我在这篇文章中投入了大量的心血和时间,希望为您提供有价值的内容。这篇文章包含了深入的研究和个人经验,我相信这些信息对您非常有帮助。

如果您觉得这篇文章对您有所帮助,我诚恳地请求您考虑赞赏1元钱的支持。这个金额不会对您的财务状况造成负担,但它会对我继续创作高质量的内容产生积极的影响。

我之所以写这篇文章,是因为我热爱分享有用的知识和见解。您的支持将帮助我继续这个使命,也鼓励我花更多的时间和精力创作更多有价值的内容。

如果您愿意支持我的创作,请扫描下面二维码,您的支持将不胜感激。同时,如果您有任何反馈或建议,也欢迎与我分享。

在这里插入图片描述

再次感谢您的阅读和支持!

最诚挚的问候, “愚公搬代码”

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。