设计模式
技术

设计模式

2023年02月14日·90 次阅读

一、什么是设计模式

1.设计模式的内容

设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。

  • 创建型模式
  • 结构型模式
  • 行为型模式
  • J2EE 模式

2.设计模式的原则

  • 开闭原则

开闭原则的意思是:对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。

  • 里氏代换原则

任何基类可以出现的地方,子类一定可以出现。LSP 是继承复用的基石,只有当派生类可以替换掉基类,且软件单位的功能不受到影响时,基类才能真正被复用,而派生类也能够在基类的基础上增加新的行为。

  • 依赖倒转原则

针对接口编程,依赖于抽象而不依赖于具体。

  • 接口隔离原则

使用多个隔离的接口,比使用单个接口要好。它还有另外一个意思是:降低类之间的耦合度。

  • 迪米特法则,又称最少知道原则

一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。

  • 合成复用原则

尽量使用合成/聚合的方式,而不是使用继承。

二、32种设计模式

image.png

1.工厂模式

定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。有一点需要注意的地方就是复杂对象适合使用工厂模式,而简单对象,特别是只需要通过 new 就可以完成创建的对象,无需使用工厂模式。

image.png

2.抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

image.png

3.单例模式

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

image.png

4.建造者模式

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

image.png

5.原型模式

原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。当直接创建对象的代价比较大时,则采用这种模式。

image.png

6.适配器模式

适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。,它结合了两个独立接口的功能。

image.png

7.桥接模式

桥接(Bridge)是用于把抽象化与实现化解耦,使得二者可以独立变化。它通过提供抽象化和实现化之间的桥接结构,来实现二者的解耦。

image.png

8.过滤器模式

这种模式允许开发人员使用不同的标准来过滤一组对象,通过逻辑运算以解耦的方式把它们连接起来。这种类型的设计模式属于结构型模式,它结合多个标准来获得单一标准。

image.png

9.组合模式

是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。

image.png

10.装饰器模式

装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。

image.png

11.外观模式

这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。

image.png

12.享元模式

享元模式(Flyweight Pattern)主要用于减少创建对象的数量,以减少内存占用和提高性能。享元模式尝试重用现有的同类对象,如果未找到匹配的对象,则创建新对象。

image.png

13.代理模式

在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。

image.png

14.责任链模式

责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

image.png

15.命令模式

请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。

image.png

16.解释器模式

这种模式实现了一个表达式接口,该接口解释一个特定的上下文。这种模式被用在 SQL 解析、符号处理引擎等。

image.png

17.迭代器模式

这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。

image.png

18.中介者模式

这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。

image.png

19.备忘录模式

备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。

image.png

20.观察者模式

当一个对象被修改时,则会自动通知依赖它的对象。

image.png

21.状态模式

在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。

image.png

22.空对象模式

在空对象模式(Null Object Pattern)中,一个空对象取代 NULL 对象实例的检查。Null 对象不是检查空值,而是反应一个不做任何动作的关系。这样的 Null 对象也可以在数据不可用的时候提供默认的行为。

image.png

23.策略模式

在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。

image.png

23.模板模式

在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。

image.png

24.访问者模式

我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。

image.png

25.MVC模式

MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式。

image.png

26.业务代表模式

业务代表模式(Business Delegate Pattern)用于对表示层和业务层解耦。它基本上是用来减少通信或对表示层代码中的业务层代码的远程查询功能。

image.png

27.组合实体模式

一个组合实体是一个 EJB 实体 bean,代表了对象的图解。当更新一个组合实体时,内部依赖对象 beans 会自动更新,因为它们是由 EJB 实体 bean 管理的。

image.png

28.数据访问对象模式

数据访问对象模式(Data Access Object Pattern)或 DAO 模式用于把低级的数据访问 API 或操作从高级的业务服务中分离出来。

image.png

29.前端控制器模式

前端控制器模式(Front Controller Pattern)是用来提供一个集中的请求处理机制,所有的请求都将由一个单一的处理程序处理。该处理程序可以做认证/授权/记录日志,或者跟踪请求,然后把请求传给相应的处理程序。

image.png

30.拦截过滤器模式

拦截过滤器模式(Intercepting Filter Pattern)用于对应用程序的请求或响应做一些预处理/后处理。定义过滤器,并在把请求传给实际目标应用程序之前应用在请求上。过滤器可以做认证/授权/记录日志,或者跟踪请求,然后把请求传给相应的处理程序。

image.png

31.服务定位器模式

image.png

32.传输对象模式

传输对象模式(Transfer Object Pattern)用于从客户端向服务器一次性传递带有多个属性的数据。传输对象也被称为数值对象。传输对象是一个具有 getter/setter 方法的简单的 POJO 类,它是可序列化的,所以它可以通过网络传输。它没有任何的行为。服务器端的业务类通常从数据库读取数据,然后填充 POJO,并把它发送到客户端或按值传递它。对于客户端,传输对象是只读的。客户端可以创建自己的传输对象,并把它传递给服务器,以便一次性更新数据库中的数值。

image.png

三、MVVM

  • M: Model,即数据。既然是前端,我们要做的事情肯定是怎么把数据给呈现到界面上了,这里的数据就是我们说的Model,通常呈现形式就是如同样是MVVM的WPF中的对象数据源或者如Vue中的JSON数据。
  • V: View,即视图。WPF中的xaml界面,或者前端领域中往往指的就是我们的HTML代码,或者说DOM应该也可以。
  • VM: ViewModel。连接界面View和数据Model的,不管你用的是什么方式,其目的就是使得View的输入能立刻保存到Model中,反之,Model的改变能立刻反应到View界面上。

image.png

那为什么说Vue没完全遵循MVVM?
Model变更触发View更新必须通过VewModel (Vue实例)。----- set时触发依赖,异步更新模板
而View变更后触发Model也必须通过VewMode。 ---------利用v-model指令 , input中用户手动输入监听@input事件,更改数据。
以上是MVVM的思想。
当然,Vue也是按照这样的设计的,但是vue中添加了一个属性ref,通过ref可以拿到dom对象,通过ref直接去操作视图。这一点上,违背了MVVM。

留言

0/200
还没有留言,来抢沙发吧~