Asjdf

一只在杭电摸鱼的小火鸡

设计模式学习笔记

2023-03-05 大约2450字 预计阅读5分钟

# 单一职责原则

干活专一

# 开放——封闭原则

软件实体(类、模块、函数)可拓展但不可修改 (open for extension, close for modification)

# 依赖倒转原则

高层模块不应该依赖低层模块,二者都应该依赖抽象(日常编程中先定义接口(interface),然后各模块都对着接口写具体过程)

抽象不应该依赖细节,细节应该依赖抽象

简言之,针对接口编程而不是针对过程编程。

名词解释:强内聚、松耦合:各模块内依赖清晰,模块间依赖低,可轻松更换。

# 里氏代换原则(LSP)

子类型一定能替换掉他的父类型

# 迪米特法则

如果两个类不必彼此直接通信,那么这两个类不应当直接发生直接的相互作用。如果其中又给类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。

类之间要松耦合。弱耦合方便对类进行修改

# 简单工厂

可以理解为一个很简单的生成器(根据传入的参数生成对象),生成不同但是都实现某接口的对象

面向对象的三个特点:封装、继承、多态 四个好处(活字印刷):可维护、可扩展、可复用、灵活性好

UML类图 是用来画对象关系图的 20230305221554-2023-03-05-22-15-55

# 策略模式

和简单工厂差不多,将传入的东西经过一定的判断生成一定的东西,相当于在简单工厂外面加一层策略。

# 装饰模式

动态地给对象添加额外的职责。比生成子类更灵活。

# 代理模式

为某对象提供一种代理以控制对这个对象的访问

远程代理(代理处于不同位置的对象)/虚拟代理(模拟、占位)/安全代理(鉴权)/智能指引

大概可以理解为整了一个中间件

# 工厂方法模式

和简单工厂干的活类似,但是是先定义了interface,再让实现了该interface的类进行生成。使得一个类的实例化延迟到子类。

# 原型模式

大概是类型实现clone方法,能够深拷贝一个对象出来。

# 模板方法模式

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

父类实现通用方法,子类对一些特殊的需要客制化的方法进行重写(或补充),调用的时候调的是父类的方法,但是不同的子类能够有不同的实现结果。(go好像这个特性不太能实现)

有点类似之前写的那个WebSerialLite, 其Print方法就是标准库的Print的子类,只不过重新实现了标准的Print::Write

# 外观模式

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

20230310154918-2023-03-10-15-49-18

可以理解为把分散在各个对象中的接口集中、优化、精简之后提供给其他对象。

# 建造者模式

将复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

把构建过程限定一下,有几个大的方法,然后具体类进行不同的实现。在go中有点类似于写构建器传入的参数用interface限制。(这块理解不是那么全面)

# 观察者模式

建立了一种一对多的关系,观察者会订阅某一对象,当对象更新时会通知所有观察者。

理解为消息订阅

# 抽象工厂模式

提供一个创建一系列相关或互相依赖对象的接口,而无需指定他们具体的类。

简单来说就是使劲使用interface解耦,方便替换实现功能的类。可以和简单工厂和策略模式结合来看。

# 状态模式

当一个对象的内在状态改变时允许其行为,这个对象看起来像是改变了其类。

大概就是改改内部变量,过程根据内部变量执行。

# 适配器模式

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

糊个中间件x

# 备忘录模式

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样之后就可将该状态恢复到原先保存的状态。

大概就是给对象加一个get状态和set状态的方式,然后在某个位置进行一个存,下回要恢复对象的时候进行一个set。

# 组合模式

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

大概就是建树用的,用户可以一致的使用组合结构(树)和结构中的单个对象(叶子)

20230310172505-2023-03-10-17-25-06

20230310172559-2023-03-10-17-26-01

# 迭代器模式

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

.Next()

# 单例模式

保证一个类只有一个实例,并提供访问它的全局访问点。

包内只init一个对象,外部要调的时候统一返回那一个对象。注意要生成新对象的时候要双锁,即判断不存在之后进入生成流程,此时上锁,获得锁之后再次判断(因为其他同时进入生成流程的线程在等锁,获得锁之后并不知道现在已经生成好了,需要再次检查是否生成好了)。

# 桥接模式

将抽象部分与实现部分分离,使他们都可以独立地变化。

日常的松耦合。

比如说有手机类和某软件类,给手机加功能就是往手机类里塞软件类。

20230310173531-2023-03-10-17-35-31

# 合成/聚合复用原则

尽量使用合成/聚合,尽量不要使用类继承。(Go基本不需要想这个问题)

20230310173312-2023-03-10-17-33-13

# 命令模式

将一个请求封装成对象,使得请求可以参数化。可对请求进行排队、记录日志、撤销等

也是在松耦合

类做自己专门的事情,干自己干的事情,如队列专门处理消息,执行器专门执行一类消息。

敏捷开发原则告诉我们不要为程序添加基于猜测的、不需要的功能

# 职责链模式

使得多个对象都有机会处理请求,从而避免请求发送者和接收者之间的耦合关系。将对象连成一条链,并沿着一条链传递该请求,直到有一个对象处理它为止

审批流(x

handler链

# 中介者模式

遵守迪米特法则——如果两个类不必彼此直接通信,那么这两个类应当直接发生直接的相互作用。

别搞FullMesh!搞中心化!(bushi

好消息:减少多对多对象群之间的耦合

坏消息:中心对象复杂度++

# 享元模式

运用共享技术有效的支持大量细粒度的对象

享元工厂根据传进来的东西判断是要新建一个对象还是让请求者和其他请求者共享一个已创建的对象。

# 解释器模式

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

输入一些东西,解释出另一些东西。常见如SQL语句解析、串行信息解析

# 访问者模式

表示一个作用于某对象结构中的各元素的操作。它是你可以在不改变各元素的类的前提下定义作用域这些元素的新操作。

听得有点没太理解,有点复杂x

# 总结

20230311233821-2023-03-11-23-38-22

闽ICP备2022001901号-1 公安网备图标闽公网安备35030302354429号

主题 atom-hugo-theme