【软件构造】课件精译(十四)面向可维护性的设计模式

一、创建型模式

(1)工厂方法模式

工厂方法也称作“虚拟构造器”,当client不知道要创建哪个具体类的实例,或者不想在client代码中指明要具体创建的实例时,用工厂方法。
定义一个用于创建对象的接口,让其子类来决定实例化哪一个类,从而使一个 类的实例化延迟到其子类。
在工厂方法模式下: Product p = new ConcreteTwo().makeObject();
举例

(3)构造器模式

(2)代理模式

某个对象比较“敏感”/“私密”/“贵重”,不希望被client直接访问到,故设置proxy,在二者之间建立防火墙。
代理的三种类型
远程代理:为一个对象在不同的地址空间提供局部代表 (缓存机制) 。
虚代理:根据需要创建开销很大的对象。
保护代理:提供访问保护。

(3)组合模式

容器中具有基本元素和组合元素两类,如何以统一的方式访问所有的元素 br>

三、行为型模型

(1)观察者模式

如何一个对象的状态受另一个对象影响者举个例子“粉丝”对“偶像”感兴趣,希望随时得知偶像的一举一动。那么,可以让粉丝到偶像那里注册,偶像一旦有新闻发生,就推送给已注册的粉丝(回调callback粉丝的特定功能)。即一种“发布-订阅”形式,发布方的变化,会通知订阅方,而订阅方在发布方注册。
需要定义一下四种对象:
Abstract subject: 维护订阅者列表
Abstract observer:定义更新的协议
Concrete subject:维护数据,修改后通知订阅者
Concrete observers:得到通知后,修改自身的状态

(2)访问者模式

对特定类型的object的特定操作(visit),在运行时将二者动态绑定到一起,该操作可以灵活更改,无需更改被visit的类。
本质上:将数据和作用于数据上的某种/些特定操作分离开来。
这样,便可以为ADT预留一个将来可扩展功能的“接入点”,外部实现的功能代码可以在不改变ADT本身的情况下通过delegation接入ADT。
当操作逻辑发生变化时,只需要修改visitor的实现,而不需要修改类。

(4)命令模式

有的时候客户端希望执行指令,但不想知道指令的细节,也不想知道指令的具体作用对象。
而命令模式的目的则是将“指令”封装为对象,指令的所有细节对client隐藏,在指令内对具体的ADT发出动作(调用ADT的细节操作) 。
例如工具箱的设计者无法知道请求的接受者或执行的操作 ,只有使用工具箱的应用知道该由哪个对象做哪个操作。
命令模式通过将请求本身变成一个对象来使工具箱对象可向未指定的应用对象提出请求。这个对象可被存储并像其他的对象一样被传递。
实现了 将所有对client提供的指令与内部执行的ADT操作彻底分开,指令对外看来是“黑盒”——进一步“变本加厉”的封装!

【软件构造】课件精译(十四)面向可维护性的设计模式
这个例子中出现了职责的传递,如果满足不了处理条件则交给下一个节点。
访问者模式与职责链模式
这两个设计模式都是将“数据”与“作用于数据上的客户端定制操作”分离开来,这样操作可以灵活增加、运行时使用的操作可以动态配置、多个操作的执行次序可以动态变化。
区别主要有两个:
区别1:visitor只定义了一个操作,chain of responsibility定义了一组操作及其之间的次序
区别2:visitor中,client创建visitor之后传入ADT,ADT再将执行权delegate到visitor;chain of responsibility中,控制权完全在各个handler之间流转,ADT(request对象)完全感受不到。

三、可重用性和可维护性设计模式的高级考虑

使用设计模式的线索(1)
“独立于制造商”,“设备独立”,“必须支持一系列产品”=>抽象工厂模式
“必须与现有对象接口”=>适配器模式
“必须与多个系统连接, 其中一些将在未来开发“,”早期原型必须展示“=>桥接模式模式
”必须与现有的一组对象接口“=>外观模式
使用设计模式的线索(2)
“复杂结构”,“必须具有可变深度和宽度”=>复合模式
“必须是位置透明”=>代理模式
“必须是可扩展的”,“必须是可扩展的”=>观察者 模式
“必须提供独立于机制的策略”=>策略模式

补充:23种设计模式

创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。
结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。
行为型模式(11种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。
https://www.cnblogs.com/malihe/p/6891920.html

文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览91280 人正在系统学习中

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2019年3月16日
下一篇 2019年3月16日

相关推荐