23种设计模式概要及易懂的例子

创建型模式(共五种)

工厂方法模式:定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。

个人总结: 通过对象工厂灵活地生产多种对象

抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

个人总结:工厂模式 >> 一种工厂,多种对象 ; 抽象工厂模式 >> 一种抽象工厂,多种工厂,每个工厂又可以生产多种对象

单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

个人总结:在类内部创造单一对象,通过设置构造方法权限,使类外部无法再创造对象

建造者模式:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

个人总结:将一些不会变的基本组件,通过builder,组合,构建复杂对象,实现分离

原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

个人总结:将对象复制了一份并返还给调用者,对象需继承Cloneable并重写clone()方法

结构型模式(共七种)

适配器模式:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。

个人总结:衔接两个不兼容、独立的接口的功能,使得它们能够一起工作。适配器起中介作用。

装饰器模式:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。

个人总结:创建类的装饰类,对被装饰类增强功能。装饰模式是继承的一个替代模式。

代理模式:为其他对象提供一种代理以控制对这个对象的访问。

个人总结:创建类的代理类,间接访问被代理类的过程中对其功能加以控制,例如在某个函数执行前后添加额外功能。(代理例子:买火车票不一定在火车站买,也可以去代售点)。 和装饰器模式的区别:装饰器模式为了增强功能,而代理模式是为了加以控制,”形式”虽然相似,”语义”却截然不同”。起中介作用

外观模式:为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

个人总结:在客户端和复杂系统之间再加一层,在这一层中将调用顺序、依赖关系等处理好。提供一个容易使用的外观层。

桥接模式:将抽象部分与实现部分分离,使它们都可以独立的变化。

个人总结:通过对Bridge类的调用,实现了对同一接口下不同实现类的调用;建立一个继承于同一抽象的不同实现类之间的关联关系,这个关系由Bridge类桥接起来。

组合模式:将对象组合成树形结构以表示”部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

个人总结:创建了一个包含自己对象组的类,并提供修改对象组的方法。应用场景,如树形菜单,文件、文件夹的管理。

享元模式:运用共享技术有效地支持大量细粒度的对象。

个人总结:重用现有的同类对象,若未找到匹配的对象,则创建新对象。例如,数据库的连接池。减少对象的创建,降低系统内存,提高效率。

行为型模式(共十一种)

策略模式:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。

个人总结:统一接口下的一系列算法类(多种策略),用一个类将其封装起来,使它们(多种策略)可动态切换。 和工厂模式的区别:工厂模式是创建型模式,是为了创建不同对象;而策略模式是行为模式,为了选择不同的行为。

模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。

个人总结:将一些固定步骤、固定逻辑的方法封装成模板方法。调用模板方法即可完成那些特定的步骤。例如,spring中对Hibernate的事务管理,开启session、关闭session等固定步骤不需重复写,直接丢给一个实体保存。

观察者模式:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

个人总结:一个对象(被观察者)状态变化时,通知所有依赖于它的对象(观察者);这种依赖方式具有双向性:观察者指定被观察的对象,或者被观察对象添加观察者,下面例子采用后者方式

迭代器模式:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。

个人总结:Java中的iterator的简单实现原理。将聚合类中遍历各个元素的行为分离出来,封装成迭代器,让迭代器来处理遍历的任务;使简化聚合类,同时又不暴露聚合类的内部。

责任链模式:避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

个人总结:在Handler类里面聚合自己,形成一条Handler链(或树、环等),并且可以将请求往下一个Handler传递(只允许传给另一个,而不允许传给多个)。例子:Struts拦截器,Filter过滤器

命令模式:将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。

个人总结:三种角色(调用者→接受者→命令);解耦行为请求者和行为实现着,实现请求和执行分开;调用者选择命令发布,命令指定执行者。

备忘录模式:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。

个人总结:创建一个备忘录类,用来存储原始类的信息;同时创建备忘录仓库类,用来存储备忘录类,当然,原始类与备忘录类的对应关系要处理好。

状态模式:允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。

个人总结:对象具有多种状态,且每种状态具有特定的行为;应用场景: 行为随状态改变而改变的场景。代码形式似乎也和哪种设计模式相似,还是那句话,设计模式提倡的是思想,而不是形式。

访问者模式:主要将数据结构与数据操作分离。

个人总结:在被访问的类里面加一个对外提供接待访问者的接口(如下面例子的accept()方法)。访问者封装了对被访问者结构的一些杂乱操作,避免这些操作”污染”被访问者,解耦结构与算法,同时具有优秀的扩展性。

中介者模式:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

个人总结:中介者对象,用来封装关联对象之间的交互操作,使关联对象之间耦合度松散;例如,MVC模式中”控制器”就是”模型”和”视图”的中介者;与适配器模式的区别:适配器模式为了桥接互不兼容的接口,中介者为了分离原始结构和交互行为。

解释器模式:给定一个语言,定义它的文法表示,并定义一个解释器,这个解释器使用该标识来解释语言中的句子。

个人总结:自己定义一种语言或表达式(附对应的解释器),用来表示一些复杂的频繁发生的行为。例如:正则表达式的解释,sql语句的解释。使用场景极少,会引起效率、性能、维护等问题。

Original: https://www.cnblogs.com/zhangzongjian/p/4737174.html
Author: zhangzongjian
Title: 23种设计模式概要及易懂的例子

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/606436/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 数据结构 图

    cpp;gutter:true;</p> <h1>include</h1> <p>using namespace std;</…

    Linux 2023年6月13日
    073
  • Java秒杀系统三:web层

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月11日
    095
  • Cisco 7200 路由 PPPOE 拨号详解

    R1(config)#vpdn enable #启用vpdn虚拟专用拨号网络 R1(config)#interface dialer 1 #定义拨号器1 R1(config-if)…

    Linux 2023年6月6日
    090
  • MySQL主从复制的原理和实现

    垂直扩展: 横向扩展: 复制:使每一个节点都有相同的数据集 MySQL复制的实现:使用二进制日志来实现 提高性能(负载均衡)、 实现读写分离 实现数据备份的功能(实时备份) 高可用…

    Linux 2023年6月7日
    098
  • 二进制安装docker

    下载二进制包 压到 /usr/local/bin ,我用的版本比较新 https://download.docker.com/linux/static/stable/x86_64/…

    Linux 2023年6月6日
    093
  • spring-data-redis 2.0 的使用

    在使用Spring Boot2.x运行Redis时,发现百度不到顺手的文档,搞通后发现其实这个过程非常简单和简洁,觉得有必要拿出来分享一下。 Spring Boot2.x 不再使用…

    Linux 2023年5月28日
    0103
  • Centos7.9编译OpenSSH的rpm安装包并升级OpenSSH

    本文介绍如何通过openssh-9.0p1.tar.gz制作openssh的rpm安装包,并升级openssh到9.0。 下载openssh-9.0p1.tar.gz 编译成rpm…

    Linux 2023年6月7日
    099
  • 解决vscode+python不提示numpy函数的问题

    使用vscode编写numpy代码时,对于numpy.array()等方法总是无法提示。查找了很多博客后,大部分都是修改配置和安装多种vscode插件,经过尝试后方法对于我来说无效…

    Linux 2023年6月7日
    092
  • Python Django构建简易CMDB

    前言 本文仅是对以前写的小示例进行一次梳理和代码优化,由于本人菜鸟一枚,前端,系统运维知识只知皮毛,后端python也没有实际开发经验,在开发过程中也没有考虑堡垒机等一系列服务器的…

    Linux 2023年6月7日
    0123
  • Linux 常用命令总结(三)

    一、实用命令 1、crontab(定时任务) (1)基本概念crontab 是用来管理定时任务的命令。系统启动后,将会自动调用 crontab,如果存在任务,则根据相关定义去执行。…

    Linux 2023年5月27日
    0108
  • 画图3D Paint 3D工作区黑屏

    最近不知道画图3D抽什么风,黑屏了。 后来研究很久,发现这货竟然是用独立显卡,集显带不起来。 解决方案是在Nvidia控制面板给他分配独立显卡,不要使用集显,不要使用集显,不要使用…

    Linux 2023年6月13日
    0100
  • LeetCode-443. 压缩字符串

    题目来源 题目详情 给你一个字符数组 chars ,请使用下述算法压缩: 从一个空字符串 s 开始。对于 chars 中的每组 连续重复字符 : 如果这一组长度为 1 ,则将字符追…

    Linux 2023年6月7日
    0101
  • 安卓投屏助手(ARDC)最新版

    近几年安卓多屏协同非常火爆,以华为小米为首的各大手机厂商都推出了各自的多屏协同软件,打破手机、平板和VR等安卓设备与电脑的边界,通过多屏融合提高办公的生产力。国内安卓投屏软件有To…

    Linux 2023年6月7日
    0312
  • centos7用rpm安装mysql5.7【初始用yum安装发现下载非常慢,就考虑本地用迅雷下载rpm方式安装】

    1.下载 4个rpm包 mysql-community-client-5.7.26-1.el7.x86_64.rpmmysql-community-common-5.7.26-1….

    Linux 2023年6月7日
    087
  • Spring事务(二)-事务传播行为

    在Spring里,一个事务方法被另外一个事务方法调用时,两个方法的事务应该如何进行,说白话一点,就是说当出现异常需要回滚时,各个方法的数据操作是否要全部回滚,事务传播行为就是决定了…

    Linux 2023年6月6日
    071
  • QML 信号与响应方法的总结

    如果面试过程中,面试官想了解你对 Qt 的理解有多少,少不了会涉及到信号槽这一块,毕竟这是 Qt 最经典的一项技术。 刚开笔,我可能有点狂妄了。 信号槽,分为两部分,信号和对信号响…

    Linux 2023年6月6日
    0104
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球