浅谈设计模式

设计模式

  • 一、设计模式简介
  • 二、设计模式分类
    • 1.创建型模式(Creational Patterns)
    • 2.结构型模式(Structural Patterns)
    • 3.行为型模式(Creational Patterns)
  • 三、创建型模式
    • 1.工厂模式
    • 2.抽象工厂模式
    • 3.单例模式
    • 4.建造者模式
    • 5.原型模式
  • 四、结构型模式
    • 1.适配器模式
    • 2.外观模式
    • 3.装饰器模式
    • 4.桥接模式
    • 5.代理模式
    • 6.组合模式
    • 7.过滤器模式
    • 8.享元模式
  • 五、行为型模式
    • 1.责任链模式
    • 2.命令模式
    • 3.迭代器模式
    • 4.模板模式
    • 5.策略模式
    • 6.观察者模式
    • 7.访问者模式
    • 8.解释器模式
    • 9.中介者模式
    • 10.备忘录模式
    • 11.状态模式
    • 12.空对象模式
  • 总结
  • 参考链接


一、设计模式简介

设计模式就是面对一些问题的最佳解决方案。众多软件开发人员在软件的开发过程中面临一些常见问题给出的解决方案,经过长期的验证和总结修正,形成了相对比较固定并且具有广泛适用性的解决模式。
设计模式主要是为了提高代码的重用性、让代码跟容易理解、保证代码的可靠性。设计模式的原则是面向接口编程而不是面向实现编程,优先使用组合对象而不是继承,尽可能复用已有类和对象。

二、设计模式分类

设计模式的参考书中总共提及23种设计模式,按照设计模式所解决的问题,这些模式可以分为创建型模式、结构型模式和行为型模式。

1.创建型模式(Creational Patterns)

在代码中优先需要创建对象,然后才能进行其他行为。创建对象,有可能需要隐藏创建逻辑、有可能整个应用只想创建一个对象,也有可能对象非常复杂。所以这些设计模式主要是为了满足以上创建对象时特殊需求的解决方案。

  • 工厂模式(Factory Pattern)
  • 抽象工厂模式(Abstract Factory Pattern)
  • 单例模式(Singleton Pattern)
  • 建造者模式(Builder Pattern)
  • 原型模式(Prototype Pattern)

2.结构型模式(Structural Patterns)

实际开发工作中有很多时候,需要在已有的功能上进行开发工作,这样我们就需要尽可能复用已有的类、对象结构、接口等。结构型的模式主要解决如何构建灵活且可复用的类、对象、接口等,并利用组合、包装等方式复用已有功能。

  • 适配器模式(Adapter Pattern)
  • 桥接模式(Bridge Pattern)
  • 过滤器模式(Filter、Criteria Pattern)
  • 组合模式(Composite Pattern)
  • 装饰器模式(Decorator Pattern)
  • 外观模式(Facade Pattern)
  • 享元模式(Flyweight Pattern)
  • 代理模式(Proxy Pattern)

3.行为型模式(Creational Patterns)

这些模式关注对象之间的通信和交互,旨在解决对象之间的责任分配和算法的封装。

  • 责任链模式(Chain of Responsibility Pattern)
  • 命令模式(Command Pattern)
  • 解释器模式(Interpreter Pattern)
  • 迭代器模式(Iterator Pattern)
  • 中介者模式(Mediator Pattern)
  • 备忘录模式(Memento Pattern)
  • 观察者模式(Observer Pattern)
  • 状态模式(State Pattern)
  • 空对象模式(Null Object Pattern)
  • 策略模式(Strategy Pattern)
  • 模板模式(Template Pattern)
  • 访问者模式(Visitor Pattern)

三、创建型模式

1.工厂模式

2.抽象工厂模式

3.单例模式

单例模式确保一个类只有一个实例,并提供一个全局访问点来访问该实例。这种模式涉及的类负责创建自己的对象,并确保只有单个对象被创建。

4.建造者模式

建造者模式使用多个简单的对象一步步构建一个复杂对象。用于将复杂的构建与其表现相分离,使得同样的构建过程可以创建不同表现的对象。一些组件常用建造者模式进行构建,比如Guava cahce组件的构建。

5.原型模式

原型模式用于高性能的创建重复的对象。利用已有的一个原型对象,快速地生成和原型对象一样的实例。比如Java中的Object clone()方法。

四、结构型模式

1.适配器模式

在软件系统中,需要将一些现有的对象放到新环境中,但是现有的对象不能满足新环境的接口。适配器模式作为两个不兼容接口的桥梁,将现有对象的接口转化成新环境的另外一个接口。

2.外观模式

外观模式主要是为了降低访问复杂系统的内部子系统时的复杂度,提供一个简化的接口用于客户端调用。

3.装饰器模式

装饰器模式主要是不使用继承的情况下,给一个类添加额外的一些功能。

4.桥接模式

桥接模式用于把抽象部分和实现部分分离,使得二者解耦可以独立变化。比如java的日志体系通过桥接模式将抽象的日志接口与具体实现进行了解耦。

5.代理模式

代理模式主要是想在访问一个类时做一些控制时,在访问者和真实对象间新增一个中间层。代理模式并不会增强被代理对象的功能(装饰器模式),也不会改变被代理对象的接口(适配器模式)。

6.组合模式

组合模式主要用于解决树型结构中的问题,可以象处理简单元素一样来处理复杂元素。这种模式中创建了一个包含自己对象数组的类,用于表示层次结构。比如目录层次非常适用于组合模式进行表示和操作。
在这里插入图片描述

7.过滤器模式

过滤器模式使用不同的标准过滤一组对象,通过逻辑运算以解耦的方式把他们连接起来,可以通过结合多个标准来获取单一标准。比如查询结果可以通过一系列标准进行结果过滤。

8.享元模式

五、行为型模式

1.责任链模式

责任链模式将请求的处理者连接成一条链,请求发送者将请求发送到这个处理链,每个处理者处理完成后会将此请求传递给下一个处理者。应用实例如Apache Tomcat对Encoding的处理、Structs2的拦截器等。

2.命令模式

命令模式是将一个请求封装成一个对象,从而用不同的请求对客户进行参数化。此模式可以将行为请求者与行为实现者进行解耦,实现二者的松耦合。

3.迭代器模式

迭代器模式就是在无须暴露出来内部表示的情况下,提供一种顺序访问一个聚合对象内部各个元素。此模式在Java中非常常见,比如Java中常用的集合类都可以通过迭代器模式进行内部元素的访问。

4.模板模式

模板模式是针对一些通用的操作步骤,定义一个操作的步骤骨架,将其中一些步骤延迟到子类中。此模式是的子类可以不改变整体结构,只需要重新定义其中一些步骤即可改变一些功能。

5.策略模式

策略模式定义一系列算法或者策略,使他们在运行过程中可以互相替换,而不用修改代码。

6.观察者模式

观察者模式主要是解决对象间一对多的依赖关系。当一个对象状态变化时,需要给其他对象通知。这样可以实现对象的易用性和低耦合。

7.访问者模式

访问者模式主要是将稳定的数据结构和易变的操作进行解耦。例如ASM中使用访问者模式对字节码进行修改。

8.解释器模式

9.中介者模式

10.备忘录模式

11.状态模式

12.空对象模式

总结

设计模式是在代码实践过程中总结出来应对特定问题的最佳解决方案。这些模式可以帮助开发者实现代码的复用、解耦和易于理解。


参考链接

1.设计模式

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

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

相关文章

【数据库】哪些操作会导致索引失效

🍎个人博客:个人主页 🏆个人专栏:数据库 ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 结语 我的其他博客 前言 在数据库管理中,索引的有效性对于查询性能至关重要。然而,索引可能会因为各种操…

蓝桥杯真题:纸张尺寸

import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改public class Main {public static void main(String[] args) {Scanner scan new Scanner(System.in);//在此输入您的代码...String s scan.nextLine();char[] c s.toCharArray();char c1 c[1];in…

2024 CKS 题库 | 6、创建 Secret

不等更新题库 CKS 题库 6、创建 Secret Task 在 namespace istio-system 中获取名为 db1-test 的现有 secret 的内容 将 username 字段存储在名为 /cks/sec/user.txt 的文件中,并将password 字段存储在名为 /cks/sec/pass.txt 的文件中。 注意:你必须创…

数据结构——顺序表专题

目录 1. 数据结构的相关概念什么是数据结构为什么需要数据结构? 2. 顺序表顺序表的概念及结构顺序表分类静态顺序表动态顺序表 3. 动态顺序表的实现准备工作顺序表的初始化顺序表的扩容尾插头插尾删头删指定位置插入数据指定位置删除数据 4. 全部完整代码**test.c**…

jenkins-maven环境的安装

jenkins-maven环境的安装

【从Python基础到深度学习】2. Ubuntu及插件安装

本期所有软件安装包:链接:https://pan.baidu.com/s/1UVEYm-12FivAnrE5NUXevg?pwdum60 一、安装Ubuntu 1.1 软件安装包:下载 VMware Workstation Pro | CN 一直点下一步即可 1.2 双击运行软件: 输入密钥 1 、VMware 15密钥 …

Git远程仓库的使用(Gitee)及相关指令

目录 1 远程仓库的创建和配置 1.1 创建远程仓库 1.2 设置SSH公钥 2 指令 2.1 git remote add 远端名称(一般为origin) 仓库路径 2.2 git remote 2.3 git push [-f] [--set-upstream] [远端名称 [本地分支名][:远端分支名]] 2.3 git clone url 2.4 git fetch 2.5 git p…

【C语言】指针的进阶篇,深入理解指针和数组,函数之间的关系

欢迎来CILMY23的博客喔,本期系列为【C语言】指针的进阶篇,深入理解指针和数组,函数之间的关系,图文讲解其他指针类型以及指针和数组,函数之间的关系,带大家更深刻理解指针,以及数组指针&#xf…

年假作业11

一、选择题 ADDAADADC&#xff0c;BD,D,B,BD,D,C,CD 二、填空题 6 2&#xff0c;3,5,7,9 rgb *s, - a 2,5 *s 三、编程题 1、 #include <iostream> using namespace std; int main() {int arr[10]{10,20,30,40,50,60,70,80,90,100};int m;//从标准输入读取一个…

Javaweb之SpringBootWeb案例之AOP核心概念的详细解析

2.3 AOP核心概念 通过SpringAOP的快速入门&#xff0c;感受了一下AOP面向切面编程的开发方式。下面我们再来学习AOP当中涉及到的一些核心概念。 1. 连接点&#xff1a;JoinPoint&#xff0c;可以被AOP控制的方法&#xff08;暗含方法执行时的相关信息&#xff09; 连接点指的…

【Win10 触摸板】在插入鼠标时禁用触摸板,并在没有鼠标时自动启用触摸板。取消勾选连接鼠标时让触摸板保持打开状态,但拔掉鼠标后触摸板依旧不能使用

出现这种问题我的第一反应就是触摸板坏了&#xff0c;但是无意间我换了一个账户发现触摸板可以用&#xff0c;因此推断触摸板没有坏&#xff0c;是之前的账户问题&#xff0c;跟系统也没有关系&#xff0c;不需要重装系统。 解决办法&#xff1a;与鼠标虚拟设备有关 然后又从知…

Packet Tracer - Configuring ASA Basic Settings and Firewall Using CLI

Packet Tracer - 使用CLI配置ASA基本设置和防火墙 IP地址表 目标 验证连接并探索ASA设备使用CLI配置ASA的基本设置和接口安全级别使用CLI配置路由、地址转换和检查策略配置DHCP、AAA和SSH服务配置DMZ区域、静态NAT和访问控制列表&#xff08;ACL&#xff09; 场景 您的公司…

嵌入式STM32 单片机 GPIO 的工作原理详解

STM32的 GPIO 介绍 GPIO 是通用输入/输出端口的简称&#xff0c;是 STM32 可控制的引脚。GPIO 的引脚与外部硬件设备连接&#xff0c;可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。 以 STM32F103ZET6 芯片为例子&#xff0c;该芯片共有 144 脚芯片&#xff0c…

Python eval函数

在Python编程中&#xff0c;eval()函数是一个强大且灵活的内置函数&#xff0c;用于动态执行字符串表达式或代码。尽管eval()函数具有强大的功能&#xff0c;但它也带来了一些潜在的安全风险&#xff0c;因此在使用时需要谨慎。本文将深入探讨eval()函数的用法、语法、示例代码…

LeetCode刷题计划---day2

07 #include <iostream> #include <iomanip> // 头文件用于控制输出格式 using namespace std;int main() {const int n 5; // 等级个数double grade[n] {4.0, 3.0, 2.0, 1.0, 0.0}; // 每个等级对应的分数string input;while (getline(cin, input)) { // 读入一…

AI - 碰撞避免算法分析(ORCA)

对比VO/RVO ORCA算法检测碰撞的原理和VO/RVO基本一样的&#xff0c;只是碰撞区域的计算去掉了一定时间以外才可能发生的碰撞&#xff0c;因此碰撞区域的扇形去掉了前面的部分&#xff0c;由圆锥头变成了个圆 另一个最主要的区别是&#xff0c;求新的速度&#xff0c;是根据相…

多进程面试题汇总

这里写目录标题 一、多进程1、进程的定义&#xff1a;2、单核多任务CPU执行原理3、进程的优点和缺点4、创建进程15、创建进程26、进程池6.1、进程池的作用6.2、原理图6.3、使用进程池的优点 7、进程间的通信&#xff08;Queue&#xff09;7.1、需求1&#xff1a;采用多进程将10…

GPIO八种工作模式

目录 一、推挽输出 二、开漏输出 三、复用推挽输出 四、复用开漏输出 五、浮空输入 六、上拉输入 七、下拉输入 八、模拟输入 GPIO八种配置模式&#xff0c;原理和使用场景&#xff0c;硬件原理如下图&#xff1a; 一、推挽输出 1、 原理 当控制栅极为低电平时&#x…

C++ STL: list使用及源码剖析

list使用 list常用函数及使用&#xff08;1&#xff09; #include <iostream> #include <list> #include <algorithm>int main() {// 创建liststd::list<int> myList {5, 2, 9, 1, 5, 6};// 打印liststd::cout << "Original list: &quo…