《大话设计模式》第15-19章---学习笔记
chapter15
AbstractFactory 模式关键就是将这一组对象的创建封装到一个用于创建对象的类(ConcreteFactory)中, 维护这样一个创建类总比维护 n 多相关对象的创建过程要简单的多。AbstractFactory 模式和 Factory 模式的区别是初学(使用)设计模式时候的一个容易引起困惑的地方。实际上, AbstractFactory 模式是为创建一组(有多类) 相关或依赖的对象提供创建接口, 而 Factory 模式正如我在相应的文档中分析的是为一类对象提供创建接口或延迟对象的创建到子类中实现。并且可以看到, AbstractFactory 模式通常都是使用 Factory 模式实现(ConcreteFactory1)
chapter16
每个人、事物在不同的状态下会有不同表现(动作),而一个状态又会在不同的表现下转移到下一个不同的状态(State)。最简单的一个生活中的例子就是: 地铁入口处,如果你放入正确的地铁票,门就会打开让你通过。在出口处也是验票,如果正确你就可以 ok,否则就不让你通过(如果你动作野蛮,或许会有报警(Alarm))。
有限状态自动机(FSM) 也是一个典型的状态不同, 对输入有不同的响应(状态转移)。通常我们在实现这类系统会使用到很多的 Switch/Case 语句, Case 某种状态, 发生什么动作,Case 另外一种状态,则发生另外一种状态。但是这种实现方式至少有以下两个问题:1) 当状态数目不是很多的时候, Switch/Case 可能可以搞定。 但是当状态数目很多的时候(实际系统中也正是如此), 维护一大组的Switch/Case 语句将是一件异常困难并且容易出错的事情。
2)状态逻辑和动作实现没有分离。 在很多的系统实现中, 动作的实现代码直接写在状态的逻辑当中。这带来的后果就是系统的扩展性和维护得不到保证。
State 模式就是被用来解决上面列出的两个问题的, 在 State 模式中我们将状态逻辑和动作实现进行分离。当一个操作中要维护大量的 case 分支语句,并且这些分支依赖于对象的状态。 State 模式将每一个分支都封装到独立的类中。State 模式很好地实现了对象的状态逻辑和动作实现的分离, 状态逻辑分布在 State 的派生类中实现,而动作实现则可以放在 Context 类中实现(这也是为什么 State 派生类需要拥有一个指向 Context 的指针)。 这使得两者的变化相互独立, 改变 State 的状态逻辑可以很容易复用 Context 的动作, 也可以在不影响 State 派生类的前提下创建 Context 的子类来更改或替换动作实现。State 模式问题主要是逻辑分散化, 状态逻辑分布到了很多的 State 的子类中, 很难看到整个的状态逻辑图,这也带来了代码的维护问题。
chapter17
类模式的 Adapter 采用继承的方式复用 Adaptee的接口,而在对象模式的 Adapter 中我们则采用组合的方式实现 Adaptee 的复用。在 Adapter 模式的两种模式中, 有一个很重要的概念就是接口继承和实现继承的区别和联系。接口继承和实现继承是面向对象领域的两个重要的概念,接口继承指的是通过继承,子类获得了父类的接口,而实现继承指的是通过继承子类获得了父类的实现(并不统共接口)。在 C++中的 public 继承既是接口继承又是实现继承,因为子类在继承了父类后既可以对外提供父类中的接口操作, 又可以获得父类的接口实现。 当然我们可以通过一定的方式和技术模拟单独的接口继承和实现继承,例如我们可以通过 private 继承获得实现继承的效果(private 继承后,父类中的接口都变为 private,当然只能是实现继承了。),通过纯抽象基类模拟接口继承的效果, 但是在 C++中 pure virtual function 也可以提供默认实现, 因此这是不纯正的接口继承,但是在 Java 中我们可以 interface 来获得真正的接口继承了。
chapter18
Memento 模式的关键就是要在不破坏封装行的前提下,捕获并保存一个类的内部状态, 这样就可以利用该保存的状态实施恢复操作。在 Command 模式中, Memento 模式经常被用来维护可以撤销(Undo) 操作的状态。
chapter19
在开发中, 我们经常可能要递归构建树状的组合结构, Composite 模式则提供了很好的解决方案。Composite 模式通过和 Decorator 模式有着类似的结构图, 但是 Composite 模式旨在构造类,而 Decorator 模式重在不生成子类即可给对象添加职责。 Decorator 模式重在修饰,而Composite 模式重在表示。
#设计##笔记#