软件构造期末复习 5.2面向可维护性的设计模式
factory method:
当client不知道要创建哪个具体类的实例,或者不想在client代码中指明要具体创建的实例时,用工厂方法;
定义一个用于创建对象的接口,让其他子类来决定实例化哪一个类,从而使一个类的实例化延迟到其子类;
每一个工厂只用来创建某一种类型下的一个或多个产品;
abstract factory(抽象工厂):
一个UI,包含多个窗口控件,这些控件在不同的OS中实现不同;
一个仓库类,要控制多个设备,这些设备的制造商各有不同,控制接口有差异;
抽象工厂模式:提供接口以创建一组相关/相互依赖的对象,但不需要指明其具体类;
抽象工厂创建的不是一个完整的产品,而是“产品族”(遵循固定搭配规则的多类产品的实例),得到的结果是:多个不同产品的object,各产品创建过程对client可见,但“搭配”不能改变。
proxy(代理模式):
某个对象比较“敏感”/“私密”/“贵重”,不希望被client直接访问到,故设置proxy,在二者之间建立防火墙
proxy VS adaptor:
adapor(适配器):
目的:消除不兼容,目的是B以客户端期望的统一的方式与A建立联系
proxy:
目的:隔离对复杂对象的访问,降低难度/代价,定位在“访问/使用行为”
observer:
“粉丝”对“偶像”感兴趣,希望随时得知偶像的一举一动;
粉丝回到偶像那里注册,偶像一旦有新闻发生,就推送给已注册的粉丝(回调callback粉丝的特定功能)
visitor:
对特定类型的object的特定操作(visit),在运行时将二者动态绑定到一起,该操作可以灵活更改,无需更改被visit的类;
本质上:将数据和作用于数据上的某种/些特定操作分离开
visitor VS iterator:
iterator(迭代器):以遍历的方式访问集合数据而无需暴露其内部表示,将“遍历”这项功能delegate到外部的iterator对象。
visitor:在特定ADT上执行某种特定操作,但该操作不在ADT内部实现,而是delegate到独立的visitor对象,客户端可灵活扩展/改变visitor的操作算法,而不影响ADT
strategy VS visitor
相同:二者都是通过delegation建立两个对象的动态联系
不同:
- visitor强调外部定义对ADT的某种操作,该操作于ADT自身关系不大(只是访问ADT),故ADT内部只需要开发accept(visitor)即可,client通过它设定visitor操作并在外部调用。
- strategy强调对ADT内部某些实现的功能的相应算法的灵活替换。这些算法是ADT功能的重要组成部分,只不过delegate到外部strategy类而已
- visitor是站在外部client的角度,灵活增加了对ADT各种不同操作(哪怕ADT没有实现该操作)
- strategy是站在内部ADT的角度,灵活变化对其内部功能的不同配置