什么是设计模式?一文理解,通俗易懂!

前言

最近在学框架的时候,老师总是时不时带两句设计模式,什么工厂模式,单例模式,开发框架用到就提一嘴,但是没有细讲,为了搞懂啥是设计模式,为哈开发框架用到它,我就查找资料,最后,写一篇博客来总结,一下, 通过学习设计模式,对各种开发框架的理解就更加透彻。

设计模式的由来

设计模式的概念最早是由 克里里斯托佛·亚历山大 在其著作 《建筑模式语言》 中首次提出的。 本书介绍了了城市设计的 “语言”,提供了了253个描述城镇、邻里、住宅、花园、房间及西部构造的模式, 而此类“语言” 的基本单元就是模式。后来, 埃里希·伽玛、 约翰·弗利利赛德斯、 拉尔夫·约翰逊 和 理查德·赫尔姆 这四位作者接受了模式的概念。 1994 年, 他们出版了 《设计模式: 可复用面向对象软件的基础》一书, 将设计模式的概念应用到程序开发领域中。

一些老的程序员也许并不了解设计模式的知识,但是同样能写出优秀的代码,主要是他们在不断地项目开发过程中不断积累,提升,优化,总结,最后摸索出来的“规律”,他们总结的规律或他们的开发经验,其实与设计模式提到的内容几乎⼀一致,同样会要求高内聚、低耦合、可扩展、可复用。类似的经历,可以想想在学习一些框架的源码时,发现它里面的某些设计和你在做开发时⼀一样。

设计模式的定义

设计模式是软件开发中一些经过验证的、可重复使用的解决方案,它们帮助程序员解决常见的编程问题。其实在了解了它的来历后,对涉及模式就有一定理解了,顾名思义,就是模式,什么模式,开发设计的模式。

可以把设计模式想象成在烹饪中的食谱:

它提供了一种做菜的方式,虽然你可以想怎么做就怎么做,但使用经典的食谱可以让你更快地做出美味的菜肴。

设计模式遵循的六大原则

  • 单一职责 :一个类和方法只做一件事
  • 里氏替换:多态,子类可扩展父类
  • 依赖倒置:细节依赖抽象,下层依赖上层
  • 接口隔离:建立单一接口
  • 迪米特原则:最少知道,降低耦合
  • 开闭原则:抽象架构,扩展实现

设计模式的分类

为了好理解,我没有细讲模式,这里只讲是设计模式是按什么来分的

创建型模式

创建型模式关注对象的创建过程,旨在将对象的创建与使用分离。主要的创建型模式有:

  • 单例模式(Singleton Pattern):确保一个类只有一个实例,并提供全局访问点。适用于需要唯一实例的场景,例如配置管理器、数据库连接池等。

  • 工厂方法模式(Factory Method Pattern):定义一个创建对象的接口,让子类决定实例化哪一个类。适用于需要创建多种类型对象但不希望具体实现细节暴露的场景。

  • 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。适用于需要创建多个相关对象的情况,例如图形界面工具中的各种控件。

  • 建造者模式(Builder Pattern):使用多个简单的对象一步步构建一个复杂的对象。适用于需要构建复杂对象的场景,如构建一个复杂的文档或者产品。

  • 原型模式(Prototype Pattern):通过复制现有的对象来创建新对象,而不是通过构造函数。适用于需要复制对象的场景,如对象的克隆和拷贝。

结构型模式

结构型模式关注对象和类的组合,旨在帮助处理对象之间的关系,使其更加灵活。主要的结构型模式有:

  • 适配器模式(Adapter Pattern):将一个类的接口转换成客户端希望的另一个接口。适用于需要兼容旧代码或不同接口的情况,例如在旧系统中引入新的接口。

  • 桥接模式(Bridge Pattern):将抽象部分与实现部分分离,使它们可以独立变化。适用于需要在多个维度上变化的场景,例如图形绘制系统中的形状和颜色。

  • 装饰器模式(Decorator Pattern):动态地给对象添加一些额外的职责。适用于需要在运行时增加功能的场景,如为窗口添加滚动条或边框。

  • 组合模式(Composite Pattern):将对象组合成树形结构以表示“部分-整体”的层次结构。适用于需要处理树形结构的场景,如文件系统中的目录和文件。

  • 享元模式(Flyweight Pattern):通过共享对象来减少内存使用。适用于大量重复对象的场景,如文本编辑器中的字符。

  • 代理模式(Proxy Pattern):为其他对象提供一种代理以控制对该对象的访问。适用于需要控制对象访问的场景,如远程代理和虚拟代理。

行为模式

行为型模式关注对象之间的交互和职责分配,旨在提高对象之间的灵活性和可扩展性。主要的行为型模式有:

  • 观察者模式(Observer Pattern):定义一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。当主题对象发生变化时,所有依赖于它的观察者都会收到通知。适用于需要实现发布-订阅机制的场景,如事件处理系统。

  • 策略模式(Strategy Pattern):定义一系列算法,将每一个算法封装起来,并使它们可以互换。适用于需要选择不同算法或策略的场景,如支付系统中的支付方式选择。

  • 命令模式(Command Pattern):将请求封装为对象,从而使你能够使用不同的请求、队列请求以及日志请求。适用于需要请求排队或撤销操作的场景,如图形编辑器中的操作历史。

  • 状态模式(State Pattern):允许对象在其内部状态改变时改变其行为。适用于对象行为依赖于其状态的场景,如状态机和工作流管理。

  • 责任链模式(Chain of Responsibility Pattern):将请求沿着处理链传递,直到有对象处理它。适用于需要动态处理请求的场景,如日志处理系统中的日志记录。

  • 备忘录模式(Memento Pattern):在不暴露对象内部结构的情况下,捕获对象的内部状态,以便稍后恢复。适用于需要撤销和恢复操作的场景,如编辑器中的撤销功能。

  • 解释器模式(Interpreter Pattern):为语言定义文法,并提供解释执行的方式。适用于需要处理和解释语言或表达式的场景,如表达式解析器。

  • 迭代器模式(Iterator Pattern):提供一种方法访问一个集合对象中的元素,而无需暴露集合对象的内部表示。适用于需要遍历集合对象的场景,如集合类库中的迭代器。

  • 模板方法模式(Template Method Pattern):定义一个算法的框架,而将一些步骤延迟到子类中。适用于需要固定算法步骤,但允许子类修改某些步骤的场景,如数据处理和文档生成。

  • 访问者模式(Visitor Pattern):允许在不改变对象的前提下定义新的操作。适用于需要对对象结构执行不同操作的场景,如对象的检验和分析。

总结 

看到这应该就更能理解了为什么要有设计模式这么个东西,它的模式和分类也不能说复杂,其实,学习设计模式,跟我说的老程序员一样,是一个“对症下药”的过程,吃“熟练度”的,死学反而效果不好,希望大家能向架构师更进一步(什么?我成架构师了?拜托,你都知道框架怎么设计了好吧~)

  • 16
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值