哈尔滨工业大学软件构造课程笔记第五章第二节

本文是哈尔滨工业大学软件构造课程笔记第五章第二节,主要讲解了面向可维护性的设计模式,包括工厂方法模式和抽象工厂模式,阐述了它们的目的、优势和应用场景。同时,还介绍了代理模式、观察者模式以及访问者模式,讨论了这些设计模式的共性和差异,以及在实际应用中的价值。
摘要由CSDN通过智能技术生成

5.2面向可维护性的设计模式

1.关于如何“创建类的新实例”的模式

(1)工厂方法模式

工厂方法
也称为虚拟构造器
目的:
-定义创建对象的接口,但让子类决定实例化哪个类。
-Factory方法让类延迟实例化到子类。

当client不知道/不确定要创建哪个具体类的实例,或者不想在client代码中指
明要具体创建的实例时,用工厂方法。
定义一个用于创建对象的接口,让该接口的子类型来决定实例化哪一个类,从
而使一个类的实例化延迟到其子类。

常规情况下,client直接创建具体对象Product p = new ProductOne();

在工厂方法模式下:Product p = new ConcreteCreatorOne().factoryMethod();

相比于通过构造器(new)构建对象:

  1. 静态工厂方法可具有指定的名称
  2. 不必在每次调用的时候都创建新对象
  3. 可以返回原返回类型的任意子类型

▪优势:
-不需要将特定于应用程序的类绑定到代码中。
-代码只处理产品界面(Trace),所以它可以工作与任何用户定义的具体产品(FileTrace, SystemTrace)▪潜在的缺点
-客户可能需要创建Creator的子类,这样他们才能创建特定的具体产品。每增加一种产品就需要增加一个新的工厂子类
-如果客户必须子类化创建者,这是可以接受的,但如果没有,那么客户必须处理另一个进化点。
▪开闭原理(OCP)
——对扩展的开放,对修改已有代码的封闭

(2)抽象工厂模式

抽象工厂模式
抽象工厂模式:提供接口以创建一组相关/相互依赖的对象,但不需要指明其具体实现类

通过一个可调用其他多个工厂的工厂

适用性
-保持独立性的不同系列的组件(产品)
初始化或陈述
-必须以相互排斥和一致的方式使用
-隐藏多个家庭存在的客户
——制造商独立
-应对即将到来的变化

Abstract Factory 创建的不是一个完整产品,而是“产品族”(遵循
固定搭配规则的多类产品的实例),得到的结果是:多个不同产品的
object,各产品创建过程对client可见,但“搭配”不能改变。
本质上,Abstract Factory是把多类产品的factory method组合在一起

抽象工厂vs工厂方法
创建一个对象 vs 创建多个类型的对象
一个factory方法 vs 多个factory方法

使用组合/委派 vs 使用继承/子类型

2.结构模式

(1)代理模式

代理模式的动机
▪目标:
-防止对象被其客户端直接访问
-通过充当实体或占位符对象的传递,允许对象级访问控制。
▪解决方案:
-使用一个额外的对象,称为代理
-客户端只能通过代理访问受保护的对象
-代理跟踪受保护对象的状态和/或位置

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

代理模式:3种类型
远程代理:为 一 个 对 象在 不 同 的 地 址 空间 提 供 局 部 代 表 (缓存机制)
虚代理:根据需要创建开销很大的对象
保护代理:提供访问保护

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

3.行为模式

(1)观察者模式

观察者模式
问题:从属的状态必须与主的状态一致
解决方案:
一种“发布-订阅”形式,发布方的变化,会通知订阅方
订阅方在发布方注册

定义四种对象:
维护订阅者列表
定义update的协议
维护数据,修改后通知订阅者
得到通知后,修改自身的状态

为对象之间一对一的依赖关系建模
-连接被观察对象的状态,主体和许多被观察对象,观察者

用法:
-保持冗余状态的一致性
-优化一批变更以保持一致性

三种变体:
发生变化时推送通知
发生变化时推送通知和数据
拉取数据

也称为发布-订阅

优点:
主体(被观察者)和观察者之间松耦合,主体不需要关注观察者
动态的增加和删除观察者
观察者的行为不受主体的控制

实施问题:
主体需要存储观察者列表
可通过在update()中增加参数来观察多个主体
触发机制

(2)访问者模式

访问者模式
对特定类型object的特定操作(visit),在运行时将二者动态绑定到一起,该操作可以灵活更改,无需更改被visit的类

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

为ADT预留一个将来可扩展功能的“接入点”,外部实现的功能代码
可以在不改变ADT本身的情况下在需要时通过delegation接入ADT

在特定ADT上执行某种特定操作,但该操作不
在ADT内部实现,而是delegate到独立的visitor对象,客户端可灵活
扩展/改变visitor的操作算法,而不影响ADT

4.设计模式的共性与差异

设计模式的对比:共性样式1
只使用“继承”,不使用“delegation”
核心思路:OCP/DIP
依赖倒置,客户端只依赖“抽象”,不能
依赖于“具体”
发生变化时最好是“扩展”而不是“修改”

Adaptor
适用场合:你已经有了一个类,但其方法与目前client的需求不一致。
根据OCP原则,不能改这个类,所以扩展一个adaptor和一个统一接口。

Proxy
适用场合:你已经有了一个类,但其方法与目前client的需求不一致。
根据OCP原则,不能改这个类,所以扩展一个adaptor和一个统一接口。

Template
适用场合:有共性的算法流程,但算法各步骤有不同的实现典型的“将共性提升至超类型,将个性保留在子类型”
注意:如果某个步骤不需要有多种实现,直接在该抽象类里写出共性实现即可。

设计模式的对比:共性样式2
在这里插入图片描述Strategy
根据OCP原则,想有多个算法的实现,
在右侧树里扩展子类型即可,在左侧
子类型里传入不同的类型实例

Iterator

Factory Method

Abstract Factory

Observer

Visitor

5.总结

▪创建型模式
-工厂方法,抽象工厂
▪结构模式
-代理
▪行为模式
——观察者,游客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值