面向对象设计的23种设计模式

设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。

  • 开发人员的共同平台
  • 最佳的实践

23个设计模式可分为三种类型的设计模式: 创建型模式(Creational Patterns)、结构型模式(Structural Patterns)、行为型模式(Behavioral Patterns) 。

描述 :这些设计模式提供了一种在创建对象的同时隐藏创建逻辑的方式,而不是使用 new 运算符直接实例化对象。这使得程序在判断针对某个给定实例需要创建哪些对象时更加灵活。

包括的模式:

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

1. 工厂模式(Factory Pattern)

定义:定义了一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象的实例化推迟到子类。

2.抽象工厂模式(Abstract Factory Pattern)

定义:定义了一个接口用于创建相关或有依赖关系的对象族,而无需明确指定具体类。

  1. 单例模式(Singleton Pattern)

定义:确保一个类最多只有一个实例,并提供一个全局访问点。

4.建造者模式(Builder Pattern)

定义:封装一个复杂对象构造过程,并允许按步骤构造。

5.原型模式(Prototype Pattern)

定义:通过复制现有实例来创建新的实例,无需知道相应类的信息。(Clone机制)

描述 :主要用于如何组合已有的类和对象来获得更大的结构,它采用继承机制来组合接口或实现,以提供统一的外部视图或新的功能

包括的模式:

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

  • 适配器模式(Adapter Pattern)

定义:将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。

  1. 桥接模式(Bridge Pattern)

定于:将抽象部分与它的实现部分分离,使它们都可以独立地变化。

3.组合模式(Composite Pattern)

定义:有时又叫作部分-整体模式,它是一种将对象组合成树状的层次结构的模式,用来表示”部分-整体”的关系,使用户对单个对象和组合对象具有一致的访问性。

4.装饰器模式(Decorator Pattern)

定义:动态地给一个对象添加额外的职责,它提供了用子类扩展功能的一个灵活的替代,比派生一个子类更加灵活。

  1. 外观模式(Facade Pattern)

定义:定义一个高层接口,为子系统中的一组接口提供一个一致的外观,从而简化了该子系统的使用。

6.享元模式(Flyweight Pattern)

定义:通过共享的方式高效的支持大量细粒度的对象。

  1. 代理模式(Proxy)

定义:代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活中常见的中介。

描述: 这些设计模式特别关注对象之间的通信。

包括模式:

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

  • 责任链模式(Chain of Responsibility Pattern)

定义:如果有多个对象有机会处理请求,责任链可使请求的发送者和接受者解耦,请求沿着责任链传递,直到有一个对象处理了它为止。

  1. 命令模式(Command Pattern)

定义:将一个请求封装为一个对象,使发出请求的责任和执行请求的责任分割开。这样两者之间通过命令对象进行沟通,这样方便将命令对象进行储存、传递、调用、增加与管理。

  1. 解释器模式(Interpreter Pattern)

定义:给定一种语言,定义它的文法表示,并定义一个解释器,该解释器用来根据文法表示来解释语言中的句子。

4.迭代器模式(Iterator Pattern)

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

5.中介者模式(Mediator Pattern)

定义:定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。中介者模式又叫调停模式,它是迪米特法则的典型应用。

6.备忘录模式(Memento Pattern)

定义:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能将该对象恢复到原先保存的状态。该模式又叫快照模式。

7.观察者模式(Observer Pattern)

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

  1. 状态模式(State Pattern)

定义:允许一个对象在其内部状态改变时改变它的行为。

9.策略模式(Strategy Pattern)

定义:定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户。

10.模板方法模式(Template Method Pattern)

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

  1. 访问者模式(Visitor Pattern)

定义:表示一个作用于某对象结构中的个元素的操作,使得在不改变各元素的类的前提下定义作用于这些元素的新操作。

Original: https://www.cnblogs.com/dev-yuxi/p/16580366.html
Author: 岁月如流的笔记
Title: 面向对象设计的23种设计模式

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

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

(0)

大家都在看

  • 新一代高性能USB转串口芯片CH342与CH343

    CH342与CH343是沁恒推出的第三代USB转串口产品,内部高度集成,外围精简,均提供VIO电源引脚,串口I/O支持独立供电。 CH342实现USB转两路高速异步串口,支持串口波…

    Linux 2023年6月7日
    0134
  • WPF获取系统dpi

    WPF获取系统dpi var dpiX = (int)typeof(SystemParameters).GetProperty("DpiX", BindingF…

    Linux 2023年6月13日
    085
  • 不同云服务器下,ubuntu下开k3s集群

    首先先感谢老哥的文章:h构建多云环境下的K3S集群,但是我尝试在centos 8.2上面前面一直执行报错并且安装glibc 2.17时还会报错make版本太低,所以直接放弃cent…

    Linux 2023年6月7日
    081
  • DHCP欺骗攻击—模拟

    实验拓扑: 基本配置: DHCP服务器配置: 客户端配置: 攻击者配置: 使用云与kail桥接 云: kail虚拟机配置: 为kali linux也添加一张网卡,桥接到VMnet1…

    Linux 2023年6月13日
    088
  • shell升级

    对/sbin/nologin的理解 系统账号的shell使用 /sbin/nologin ,此时无法登陆系统,即使给了密码也不行。 所谓”无法登陆”指的仅是…

    Linux 2023年5月28日
    0100
  • Spring 4 集成 redis 实现缓存 二

    项目开发过程中经常用到mybatis,为了提升查询效率,mybatis支持一级和二级缓存,一级缓存基于SqlSession级别,默认开启,二级缓存基于Mapper级别;一级和二级缓…

    Linux 2023年6月14日
    089
  • tcpreplay重放报文,tcpdump能抓到包,应用程序收不到包

    现象: 生产环境中有两台服务器A、B,A服务器实时有报文发往B服务器。为了在测试环境测试新功能,故在现网A服务器上tcpdump抓取发往B服务器的报文,然后在测试环境tcprewr…

    Linux 2023年6月14日
    094
  • 代码审计-PHP反序列化漏洞

    什么是序列化 序列化可以实现将对象压缩并格式化,方便数据的传输和存储。为什么要序列化?PHP 文件在执行结束时会把对象销毁,如果下次要引用这个对象的话就很麻烦,所以就有了对象序列化…

    Linux 2023年6月6日
    0112
  • thinkphp5简单使用redis缓存

    csharp;gutter:true; connect("127.0.0.1","6379");</p> <pre>…

    Linux 2023年5月28日
    0107
  • zabbix快速安装(yum)

    1、先卸载系统自带数据库 [root@bogon ~]# rpm -e mariadb-libs-5.5.56-2.el7.x86_64 –nodeps 2、安装mys…

    Linux 2023年6月6日
    077
  • 零成本搭建个人博客之迁移Pages和域名

    在上文[零成本搭建个人博客之搭建篇]中,我将Hugo博客搭建到 Github Page上,后来考虑到用 Cloudflare cdn加速,干脆就把博客站点迁移到Cloudflare…

    Linux 2023年6月7日
    076
  • 【Example】C++ 模板概念讲解及编译避坑

    C++ 不同于 Java,它没有标准的 Object 类型。也就意味着 C++ 并不存在完整的泛型编程概念。 为什么不存在完整的泛型编程概念,放到最后一个例子讲,先讲 &#8220…

    Linux 2023年6月13日
    078
  • 阿里云Redis开发规范

    (1)【建议】: 可读性和可管理性 以业务名(或数据库名)为前缀(防止key冲突),用冒号分隔,比如业务名:表名:id <span class="hljs-sele…

    Linux 2023年5月28日
    0110
  • 系统初始化

    一般系统安装好后,按照自己习惯定义 csharp;gutter:true;</p> <h1>alias</h1> <p>echo &…

    Linux 2023年6月7日
    049
  • mysql查询中字符串转换成数字

    在操作mysql时,经常需要将字符转换成数字,这一步虽然简单,但不常用的话也很容易忘记,现将在网上找到的方法记录如下: 1.将字符的数字转成数字,比如’0’…

    Linux 2023年6月13日
    068
  • Xshell配置ssh免密码登录-密钥公钥(Public key)与私钥(Private Key)登录【已成功实例】

    本文转自https://blog.csdn.net/qjc_501165091/article/details/51278696 ssh登录提供两种认证方式:口令(密码)认证方式和…

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