目的:分辨不同模式的区别,明晰不同模式的优缺点,及各种模式的变种
步骤:初步收集模式的同时,与前面比较,当后面出现的模式与前面有可比之处时,再加入比较
分类:由不同的分类法,可以将内容学习的更透彻,因此需要在学习中不断的补充完整(继承与组合,解耦方式...)
说明:因此这篇文章不可能一两天完成,我会把内容逐渐补充完整
一、模式介绍
1、模版方法
abstract class AbstractClass{
final void templateMethod(){ //final 提示我们这个模式可用来建造框架
primitiveOperation1();
primitiveOperation2();
concreteOperation();
hook();
}
abstract void primitiveOperation1(); //abstract将实现推迟到子类
abstract void primitiveOperation2();
final void concreteOperation(){ //可以通用的子方法我们直接实现
//implement here
}
void hook() {} //钩子增加了灵活性(1.让子类能够有机会对模板方法中某些即将
} 发生的(或刚刚发生的)步骤做出反应.2.作为条件控制,影响抽
象类中的算法流程. ...)
2、组合模式
允许你将对象组成树形结构来表现“整体/部分”的层次结构。组合能让客户以一致的方式处理个别对象和对象组合
Client --------------->Component
operation()
add(Component)
remove(Component)
^ getChild(int)^
/ \
/ \
Leaf Composite
operation() add(Component)
remove(Component)
getChild(int)
operation()
3、状态模式
允许对象在内部状态改变时改变他的行为,对象看起来好像修改了它的类(使用组合通过简单引用不同的状态对象来造成类改变的假象)
Context------------------->State
request() handle()
| / \
| / \
state.handle() ConcreteStateA ConcreteStateB
handle() handle()
二、模式辨析
好莱坞原则VS依赖倒置原则: 技巧(弹性设计,低层互操作,不会让高层组件依赖底层组件) VS 多使用抽象(更注重如何在设计中避免
依赖) 目标都在于解耦
模版方法VS策略模式 : 定义算法大纲VS定义算法家族,算法互换 继承VS组合 实现抽象方法VS实现整个算法
模板方法VS工厂方法 : 工厂方法是模板方法的一个特殊版本
状态模式VS策略模式 : 状态改变定义好了VS控制对象使用策略 具有相同的类图,目的不同
三、模式分类
基于继承 基于组合
模板方法 策略模式