GuangchaoSun's Blog

设计模式入门

Head First 设计模式读书笔记
Head First 系列确实不错,浅显易懂,还挺有趣的。目前这本书只看了前五个设计模式,总的来说,虽然可以看懂,但离实际自己能运用上还有些距离,可能需要多一些开发经验吧。
在学习设计模式的时候,画图是很重要的一点。

入门篇

先来看书中一开始提到的三条设计原则。

  • 找出应用中可能需要变化之外,把它们独立出来,不要和那些不需要变化的代码混在一起
  • 针对接口编程,而不是针对实现编程
  • 多用组合,少用继承

策略模式

定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让(行为)算法的变化独立于使用算法的客户。
自己的见解:
首先有一个抽象类(主体),具体的角色来继承这个主体。抽象类对应着一个接口,抽象类中实现了接口的实例。接口负责封装行为,具体的行为可以实现这些接口,所以当有新的行为增加时,就可以不必改变原有的代码。具体见P22

观察者模式

简要概括:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

  • 在观察者模式中,会改变的是主题的状态,以及观察者的数目和类型。用这个模式,可以改变依赖于主题状态的对象,却不必改变主题。这就叫提前规则。
  • 主题与观察者都使用接口:观察者利用主题的接口向主题注册,而主题利用观察者接口通知观察者.这样可以让两者之间运作正常,同时又具有松耦合的优点。
  • 观察者模式利用“组合”将许多观察者组合进主题中,对象之间的这种关系不是通过继承产生的,而是在运行过程时利用组合的方式而产生的。

以上三点分别对应于开头文中提到的三条设计原则。
设计原则:为了交互对象之间的松耦合设计而努力。
要点:

  • 松耦合的设计之所以能让我们建立有弹性的OO系统,能够应对变化,是因为对象之间的互相依赖降到了最低。
  • 观察者模式定义了对象之间一对多的关系
  • 观察者和可观察者之间用松耦合(loosecoupling)方式结合,可观察者不知道观察者的细节,只知道观察者实现了观察者的接口。

最后看一下观察者模式(自己实现)的实例:WeatherData
注:java.util.Observable是一个类而不是接口,是Java中观察者模式的实现。

装饰者模式

说明:装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
设计原则:类应该对扩展开放,对修改关闭。
装饰着模式动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
注意:

  • 装饰者和被装饰者对象有相同的超类型
  • 可以用一个或多个装饰者包装一个对象
  • 装饰者可以在所委托被装饰者的行为之前\或之后,加上自己的行为,以达到特定的目的
  • 对象可以在任何时候被装饰,所以可以在运行时动态地、不限量地用喜欢的装饰者来装饰对象

缺点:

  • 可能会在设计中加入大量的小类
  • 类型问题
  • 采用装饰者模式在实例化组件时,将增加代码的复杂度

代码实现:Coffee

工厂模式

工厂方法模式
声明一个工厂方法:

abstract Product factoryMethod(String type)
sauce = ingredientFactory.creatSzuce

工厂方法模式通过让子类决定该创建的对象是什么,来达到将对象创建的过程封装的目的。
定义:工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
优点:将创建对象的代码集中在一个对象或方法中,可以避免代码的重复并且更方便以后的维护。
设计原则:要依赖抽象,不要依赖具体类

抽象工厂模式:
抽象工厂模式提供一个接口,用于创建相关或依赖对象或依赖对象的家族,而不需要明确指定具体类。

进度-P91