GOF 设计模式(学习Hander First 设计模式 笔记)
一切都是围绕,变化!模式为了封装变化。 封装变化!!解耦系统!!
1.策略模式
2009年2月8日
17:05
封装行为
针对接口编程。
通常的设计
1.通过继承父类。 | 会增加很多特殊子类不需要的行为,所有的子类都受父类影响。 | 继承提供了复用。 |
2.实现接口。 | 虽然可以满足个性化的需要,但是却无法复用。 | 接口提供个性化 |
|
|
|
这两种做法都是依赖于实现,设计僵硬,无法更改行为。
使用行为类方式,子类使用接口所表示的行为,实际的实现不会绑定在子类中。
这样的话,当发生变化的时候,进行的是行为的替换,而不需要修改现有的行为。
也可以添加其他新的行为,并通过配置的方式实现不需要修改现有代码,来应对变化。
在变化的时候,保护了现有的类,而受到变化影响的是行为类。
使用行为类的方式 | 有了继承的复用,却没有包袱。 |
2.观察者模式
2009年2月10日
21:12
观察者模式提供了 一个一对多依赖时,松耦合的解决方案。
注意,在使用观察者的解决方案里面,存在 拉 和 推 两种模式。
3.装饰者模式
2009年2月10日
21:46
4.工厂模式
2009年2月10日
22:33
工厂模式 : 负责将客户从具体类型中解耦。
抽象工厂模式:解耦,并且负责创建整个产品家族。
5.单件模式
2009年2月12日
23:35
解决单件模式,线程同步的问题的方法:
1.双重检查加锁。
2.使用急切创建实例,即不使用延迟创建的方式。
6.命令模式
2009年2月16日
20:32
将动作的"请求者"从动作的"执行者"对象中解耦。
封装变化点,即 使两个对象解耦。
将"请求"封装成对象,以便使用不同的请求,队列或者日志来参数化其他对象,命令模式也支持可撤销的操作。
- 命令对象将动作和接收者包进对象中。
- 可以使用空对象。
通过使用命令模式支持Meta Command Pattern ,即命令宏。
使用命令模式,可以实现队列,日志。
7.适配器模式
2009年2月16日
22:19
8.外观模式
2009年2月16日
22:20
9.模板方法模式
2009年2月16日
23:01
需要注意的是,模板方法有很多中变体。如参数是Icompare ,这时系统里面的一个步骤是调用Icompare.compareto ,这也是一种模板方法。
而且实现的时候,如果是必须由子类实现的,那么实现为抽象类,如果是可由子类选择实现的,那么实现为钩子,给出基本的实现,子类可以覆盖。
模板方法和策略模式的区别也就是,策略模式替换的是整个算法,而模板方法,中只是替换一个步骤。
10.组合模式
2009年2月16日
23:09
使用组合结构,我们能把相同的操作应用在组合和个别对象上,
换句话说,在大多数情况下,我们可以忽略对象组合和个别对象之间的差别。
当对象组合和个别对象实现统一的操作接口时,也许有的方法并不能通用,这个时候的最好的的方法就是在不需要实现的方法中,抛出异常。
组合模式以单一职责原则换取系统透明性。
组合模式为具有整体/部分的复杂结构,提供了好的透明性,使得系统可以采用统一的接口进行操作。
11.状态模式
2009年4月8日
0:09
基本常识:策略模式和状态模式是双胞胎,在出生时才分开。
使用状态模式可以:
1.将每个状态的行为局部化到自己的类中。
2.将容易产生问题的if语句删除。(去掉复杂的条件判断语句,使架构灵活。)
3.让每个状态对修改关闭,让整体对扩展开放。
4.使得代码易于理解。
状态模式:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
状态 | 策略 |
状态对象--包含一组行为 | 行为对象 |
用户并不知道行为是如何变化的,用户实际上也不能直接操作状态对象,用户只是操作Context对象,修改Context的属性等。 | 用户直接配置行为对象。 |
比if等复杂条件判断更易于扩展的解决方案,通过将行为包装到状态对象中,可以通过修改context的状态,实现改变行为。 | 比继承更具有弹性的行为继承方案。可以组合不同的对象改变行为。 |
尽管使用设计模式,通常都会增加很多的类和对象,但是可以让架构变得很干净,在以后理解和维护它们的时候,可以节省时间。
12.代理模式
2009年4月13日
22:43
代理可以假装自己是远程对象,但其实只是一个中间角色。
组合
2008年12月8日
17:55
使用组合,让架构具有 运行时改变行为的能力。