敏捷开发读书笔记五
command模式
类图先行
templete method(模板方法)模式和strategy(中介者)模式
- 优先使用对象组合而不是类继承(老生常谈的问题)
- 模板方法模式和策略模式体现了继承和委托之间的区别.他们要解决的问题类似,但是模板方法模式利用继承解决问题,策略模式利用委托来解决问题
模板方法模式
类图先行
策略模式
类图先行
- 模板方法和策略模式都可以用来分离高层算法和低层具体实现细节.都允许高层的算法独立于它的具体实现细节重用.
facade(外观)模式和mediator(中介者)模式
- 这两种模式都是把某种策略施加到另一组对象上,facade模式从上面施加策略,mediator模式从下面世家策略
- 如果策略涉及范围广泛而且课件,可以使用facade模式从上面世家策略.如果策略隐藏并且具有针对性,mediator则是更好的选择.
- facade通常是约定的关注点,每个人都去使用facade而不关心其下隐藏的对象.mediator则对用户是隐藏的.他的策略是既成事实而非一项约定事务.
facade模式
类图先行
- facade对用户隐藏了下层的复杂性,并且与用户约定必须通过facade来操作下层的操作而不能绕过.
- facade模式是明显且受限的施加策略.
mediator模式
类图先行
- mediator模式以隐藏且不受限的方式来施加策略.
singleton模式(单例)和monostate模式
- singleton和monostate都有单一的含义.singleton通过将构造函数私有化来维持单一实例,monostate通过将所有字段注册为静态字段(static)来保证所有实例都是统一状态.
- 多数情况下,这两种模式的实施代价远低于它们的表达力带来的收益.
- sigleton强调结构上的单一性,只能创建一个实例.monostate强调行为上的单一性,所有实例操作的都是同一字段.
- 如果希望通过派生去约束一个现存类,并且不介意他的所有调用者都必须调用instance()方法来获取访问权,那么singleton最合适的.
- 如果希望类的单一性本质对使用者透明,或者希望使用单一对象的多态派生对象,那么monostate最合适.
singleton模式
优点:
- 跨平台
- 适用于任何类(只需要将构造函数私有并添加相应的static函数和变量)
- 可以通过派生创建(可以创建一个给定类的sigleton子类)
- 延迟求值(sigleton未使用的时候就不需要创建)
缺点:
- 摧毁方法未定义
- 不能继承(singleton派生的子类不是sigleton)
- 效率问题(instance方法中的if)
- 不透明性(使用者知道操作的是sigleton对象)
monostate模式
优点:
- 透明性(使用者不知道操作的是monostate对象)
- 可派生性(monostate所有的派生类都是monostate)
- 多态性(monostate的派生类可以overwrite父类的方法)
缺点:
- 不可转换性(普通类不能转换成monostate)
- 效率问题
- 内存占用(static变量,即使没有使用,也会占用内存)
- 平台局限性
null object模式
定义一个接口,实现接口时候分为null实现和implementation实现,当出现null情况的时候,返回null实现,从而避免琐碎的判空代码.
null object的实现代价要高于它的收益.好像陷入了复杂性的badsmell?