定义一个操作中算法的骨架,而将一些步骤延迟到子类中。模板方法使子类可以重定义算法的某些特定步骤而不改变算法的结构。
模板方法模式中的控制流程是倒转的,因为父类的模板方法调用其子类的操作,而不是子类调用父类的操作。

Anysandwich 父类中的标准步骤代表了制作三明治的算法。算法实现于make 方法之中,并预留出一些操作,由子类做具体实现。所以子类其实不必了解算法的细节,同时父类也不必了解子类所提供的具体操作细节。
模板方法与委托方法的使用场景
- 模板父类定义一个一般算法,但缺少某些特定/可选的信息或算法,它通过这些缺少的信息或算法起到一个算法食谱的作用,缺少的信息由子类通过继承来提供
- 委托算法由任何对象通过对象组合来提供
保证模板方法正常工作
抛出异常
向模板方法增加额外的步骤
必要时子类可以扩展的父类中的方法叫做“钩子”,默认的钩子方法通常什么都不做,而且钩子方法对子类来说是可选的。
在Cocoa Touch 框架中的使用
- (void)drawRect:(CGRect)rect
这个默认实现什么也不做。uiview 的子类如果真的需要绘制自己的视图,就重载自己的方法。所以这个方法就是钩子方法。
其他模板方法

网友评论