策略模式-strategy
- mod1:找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起;
不同鸭子类型的飞行行为、鸣叫行为,会有不同的实现,可独立出来,和其他区分--区分变化的和不会变化的部分。
- mod2:针对接口编程,而不是针对实现编程;
鸭子子类使用接口表示行为,所以具体的实现不会绑死在鸭子的子类中,且可以在运行时改变行为。
- mod3:多用组合,少用继承;
‘有一个’比‘是一个’更好,鸭子的具体行为可以委托给具体的行为类去处理,使用组合建立的系统有很大的弹性,不仅可以将算法簇封装成类,更可以在运行时改变行为。
- 策略模式:策略模式定义了算法簇,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户;
观察者模式-Observer
- 观察者模式:观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,他的所有依赖者都会收到通知并自动更新;
- 为了交互对象之间的松耦合设计而努力;
主题和观察者之间松耦合,但依然可以交互,但不太清楚彼此的细节;主题只知道观察者实现了某个接口(Observer接口),但不知道其具体的实现,主题依赖的是Observer接口实现的对象列表,所以可以随时添加观察者,运行时也可以随意替换观察者;
- 挑战设计原则
1. mod1:观察者模式中,会改变的是主题的状态,以及观察者的数目和类型。用这个模式,你可以改变依赖于主题状态的对象,却不必改变主题。这就叫提前规划;
2. mod2:主题与观察者都使用接口:观察者利用主题的接口向主题注册,而主题利用观察者接口通知观察者。这样可以让他们之间运作正常,又同时具有松耦合的特点;
3. mod3:观察者模式利用‘组合’将许多观察者组合进主题中。对象间的这种关系不是通过继承产生的,而是在运行时利用组合的方式而产生的;
装饰者模式-Decorator
- mod4:类应该对扩展开放,对修改关闭
动态地组合对象:利用此技巧,把多个新职责,甚至设计超类时还没想到的职责加在对象上,而且不用修改原来代码。
- 装饰者模式组成
装饰者、被装饰者对象有相同的超类型;
可以用一个或多个装饰者包装一个对象;
拥有相同超类型,所以任何需要原始(被包装的)的场合,可以用装饰过的对象代替它;
装饰者可以在所委托被装饰者的行为之前or之后加上自己的行为,以达到特定目的;
对象可以在任何时候被装饰,即可以在运行时动态的、不限量的使用需要的装饰者来装饰对象;
- 装饰者模式定义:装饰者模式动态的将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
- 每个装饰者有一个(包装)组件,即装饰者有一个实例变量以保存某个Component的引用;