可维护性设计模式 Design Patterns for Maintainability

本文介绍了设计模式中的三大类模式:创建型模式、结构型模式和行为型模式,并详细阐述了每种模式的应用场景及其实现原理。重点讲解了工厂方法模式、抽象工厂模式、建造者模式、桥接模式、代理模式、组合模式、观察者模式、访问者模式、状态模式以及备忘录模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. Creational patterns 创造性模式

(1) Factory Method pattern 工厂方法模式

当client不知道要创建哪个具体类的实例,或者不想在client代码中指明要具体创建的实例时,用工厂方法。 

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

例如:

接口


两个类implements此接口


工厂接口


静态工厂方法:


满足原则

 Open-Closed Principle (OCP) ——对扩展的开放,对修改已有代码的封闭


(2) Abstract Factory  抽象工厂模式

抽象工厂模式:提供接口以创建一组相关/相互依赖的对象,但不需要指明其具体类
创建的不是一个完整产品,而是“产品族”(遵循固定搭配规则的多类产品的实例),
得到的结果是:多个不同产品的 object,各产品创建过程对client可见,但“搭配”不能改变。 
 本质上,Abstract Factory是把多类产品的factory method组合在一起


(3) Builder  构造器模式

创建复杂对象,包含多个组成部分 

client要的不是一堆零散的objects (abstract factory那样的结果),

而是一个完整的产品,client 不关心其中的细节组成部分 是什么,如何创建

Abstract Factory 创建的不是一个完整产品,而是“产品族”(遵循 固定搭配规则的多类产品实例),

得到的结果是:多个不同产品的实 例object,各产品创建过程对client可见,但“搭配”不能改变。

Builder 创建的是一个完整的产品,有多个部分组成,client不需了解 每个部分是怎么创建、各个部分怎么组合,

最终得到一个产品的完整 object  


2 Structural patterns  结构模式

(1) Bridge  桥接模式

Bridge是OOP最基本的structural pattern,
通过delegation+inheritance 建立两个具体类之间的关系(DIP依赖转置,抽象依赖于抽象)

实例:




Bridge vs. Strategy 区别

 Bridge: structural pattern 强调双方的run time delegation linking

Strategy: behavioral pattern 强调一方run-time使用另一方的“算法” 

“算法”通常实现为“类的某个方法”的形式, strategy的目的并非在“调用算法的类”与“被调用算法所在的类”之间建立起永久联系,而只是帮助前者临时使用后者中的“算法”,前者无需永久保存后者的实例。

Strategy:使用螺丝刀的时候,针对不同的工 作任务,选取不同的“刀头”,但目的并非将螺丝刀与刀头组合起来建立永久的delegation, 而只是临时通过delegation完成任务(即调用刀 头的“算法”),然后二者再无联系。

强调算法的动 态调用,但前提是动态绑定

Bridge:类A需要完成“通讯”功能,它有一个组成部分Device类,这是个抽象接口(模式中的implementor),有多种实现方式(PC, tablet, phone,即ConcreteImplementor),该模式在运行时为类A的具体子类型实例设定具体 的Device的具体实现(强调对A和Device两个 抽象类的各自实例之间如何建立delegation),进而在其他各项功能中利用其通讯功能(这不 再是bridge关注的目标)。

强调结构关系的动态绑定


(2) Proxy  代理模式

某个对象比较“敏感”/“私密”/“贵重”,
不希望被client直接访问到,故设置proxy,在二者之间建立防火墙。

实例:




Proxy vs. Adaptor

Adapter: structural pattern, 

目的:消除不兼容,目的是B以客户端期望的统一的方式与A建立起联系。 

 Proxy: behavioral pattern,

目的:隔离对复杂 对象的访问,降低难度/代价,定位在“访问/使用行为。


(3) Composite  组合模式


实例:


Composite vs Decorator

Composite: structural pattern,

目的是在同类型的对象之间建立起树型层次结构,一个上层对象可包含多个下层对象

Decorator: structural pattern,

强调的是同类型对象之间的“特性增加”问题, 它们之间是平等的,

区别在于 “拥有特性”的多少,每次decoration 只能作用于一个object。 


3 Behavioral patterns  行为模式

(1) Observer

  • 观察者模式(Observer Pattern)又称为发布订阅模式(Publish/subscribe)
  • 定义对象间的一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并且自动更新
  • 根据单一职责原则,每个类的职责是单一的,我们可以通过触发机制,形成一个触发链,把各个单一的职责串联成真实世界中的复杂的逻辑关系。
  • 观察者模式的角色分工(JDK中提供了抽象接口的定义): 
    • Subject被观察者: 
      抽象类型,定义被观察者必须实现的职责,动态地增加和取消观察者
    • Observer观察者: 
      接口,观察者接收到消息后会进行update,对接收到的消息进行响应
    • Concrete Subject/Observer
      提供具体的业务逻辑的实现

例如:

“粉丝”对“偶像”感兴趣,希望随时得知偶像的一举一动 

粉丝到偶像那里注册,偶像一旦有新闻发生,就推送给已注册的粉丝 (回调callback粉丝的特定功能)

实例:




(2) Visitor

对特定类型的object的特定操作(visit),在运行时将二者动态绑定到一起,

该操作可以灵活更改,无需更改被visit的类 

本质上:将数据和作用于数据上的某种/些特定操作分离开来


3.State Pattern 状态模式 (behavioral pattern)

最好不要使用if/else结 构在ADT内部实现状 态转换(考虑将来的扩展和修改)
使用delegation,将状 态转换的行为委派到独 立的state对象去完成

实例:






 Memento Pattern  备忘录模式 (behavioral)


记住对象的历史状态,以便于“回滚”


### 如何评估使用设计模式解决具体问题的效果 #### 1. 可维护性和可读性提升 当引入适当的设计模式时,代码通常会变得更加块化和易于理解。例如,在实现复杂的业务逻辑时,如果采用了外观式(Facade Pattern),则可以通过减少客户端与子系统的交互复杂度来提高代码的可读性[^3]。 #### 2. 扩展性的增强 通过运用像装饰器(Decorator)这样的式,可以在不改变原有对象的基础上动态地为其添加职责或行为,从而使得应用程序更灵活并容易适应未来需求的变化[^2]。 #### 3. 复用能力的增长 设计模式提供了经过验证的最佳实践方案,这有助于开发者创建更加通用且高效的组件和服务。对于那些频繁遇到相似挑战的情况来说尤其有用;比如利用工厂方法(Factory Method),可以轻松生产不同类型的产品实例而无需修改现有代码结构[^1]。 #### 4. 性能影响分析 虽然大多数情况下合理选用合适的设计模式不会显著降低性能表现,但在某些特定场景下可能会带来额外开销。因此,在决定是否采纳某种式之前应当考虑其对系统效率的影响,并权衡利弊做出最佳决策。 为了全面衡量上述各方面因素所带来的效果变化,建议采取如下措施: - **编写单元测试**:确保新加入的功能能够正常工作的同时也证明旧有部分未被破坏; - **审查代码库的历史记录**:观察自引入新式以来是否有明显改进趋势,如缺陷率下降、开发周期缩短等现象发生; - **收集团队成员的意见反馈**:了解实际使用者的感受以及他们认为哪些地方得到了改善或是遇到了困难。 综上所述,通过对这些维度进行全面考量可以帮助更好地判断所选设计方案的有效程度及其长远价值所在。 ```python def evaluate_design_pattern_effectiveness(): """ A function to simulate evaluating the effectiveness of using design patterns. Returns a dictionary with evaluation metrics and their respective scores (hypothetical). """ evaluations = { 'Maintainability': 90, 'Readability': 85, 'Extensibility': 92, 'Reusability': 88, 'PerformanceImpact': 'Minimal' } return evaluations ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值