软件设计模式与架构

学习总结

1 设计模式

1.1 概述

23种设计模式:

创建型

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

Factory Method: 定义一个用于创建对象的接口,让子类决定将哪一个类实例化。其使一个类的实例化延迟到其子类。

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

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

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

结构型

Adapter: 将一个类的接口转换成客户希望的另一个接口。其使得原本接口不兼容的类一起工作。

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

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

Decorator: 动态地给一个对象添加一些额外的职责。就扩展功能而言,其比生成子类方式更为灵活。

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

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

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

行为型

Chain of Responsibility: 为解除请求的发送者和接收者之间耦合,而使得多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。

Command: 将一个请求封装为一个对象,从而使得你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。

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

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

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

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

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

State: 允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类。

Strategy: 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法的变化可独立于使用它的客户。

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

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

1.2 模式分类与联系

设计模式空间
设计模式之间的联系

此外,还有一种16种设计模式的说法,创建型模式中原型模式被简单工厂模式替代,结构型模式中去掉组合模式,行为型模式中去掉责任链模式、解释器模式、迭代器模式、备忘录模式、模板方法模式、访问者模式。

1.3类之间的关系

泛化:表现为继承非抽象类。实线空心三角箭头。

实现:表现为继承抽象类或接口。虚线空心三角箭头。

关联:表现为成员变量。实线箭头。

依赖:表现为成员函数参数。虚线箭头。

聚合与组合:也表现为成员变量。实线空心菱形箭头。菱形所在方为被组件组成方。组合表示的依赖关系比聚合更强。

1.4 模式比较

适配器模式:可分为类适配器和对象适配器,类适配器采用多继承的方式,适配器类同时继承被适配类和目标类,供客户类使用;对象适配器采用关联的方式,适配器类继承目标类,持有被适配类成员变量,供客户类使用。

装饰器模式:装饰类继承被装饰类并持有被装饰类成员变量,由装饰类来决定是否调用被装饰类的行为以扩展自己的行为。

代理模式:代理类和被代理类继承同一个父类,代理类持有被代理类成员变量,客户类通过调用代理类使用被代理类。

1.5 SOLID设计原则

单一职责原则(Single Responsibility Principle):一个类或者一个模块只做一件事。

开闭原则(Open Closed Principle):对扩展开放,对修改关闭。

里氏替换原则(Liskov Substitution Principle):派生类可以扩展基类的功能,但不能改变基类原有的功能。

接口隔离原则(Interface Segregation Principle):一个接口应该拥有尽可能少的行为,对于不同的功能的模块分别使用不同接口,而不是使用同一个通用的接口。

依赖倒置原则(Dependence Inversion Principle):高级模块不应该依赖低级模块,而是依赖抽象接口,通过抽象接口使用对应的低级模块。

2 架构

架构比设计模式更加宏观,关注软件整体结构而不是具体的类之间的关系。

2.1 常见架构

分层架构

MVC架构

管道过滤器架构

C/S架构

事件驱动架构

微服务架构

2.2 领域驱动设计

领域驱动设计(Domain-Driven Design,简称DDD)用于应对复杂业务逻辑。

在传统的CURD开发里,业务逻辑都在service层,对象只是数据的载体,没有行为。DDD可以简单理解为引入了领域对象用于领域服务,在数据库持久化对象上又封装了一层,避免业务逻辑更改影响数据持久化操作。

3 参考资料

《Design Patterns Elements of Reusable Object-Oriented Software》 作者 Erich Gamma Richard Helm Ralph Johnson John Vissides

图说设计模式 — Graphic Design Patterns

领域驱动设计在互联网业务开发中的实践 - 美团技术团队

为什么很多程序员不用switch,而是大量的if……else if?(关于过度设计的很生动的回答)


软件设计模式与架构
https://reddish.fun/posts/Article/software-design-patterns-and-architecture/
作者
bit704
发布于
2023年4月19日
许可协议