一.定义介绍
在模板模式(Template Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行。这种类型的设计模式属于行为型模式。
在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。
模板方法模式:通过子类化 编译时间algorithmselect
策略模式:通过遏制 运行时algorithmselect
模板模式
它基于inheritance。
定义不能被子类改变的algorithm的骨架。只有某些操作可以在子类中重写。
父类完全控制algorithm ,仅将具体的步骤与具体的类进行区分。
绑定是在编译时完成的。
策略模式:
它基于授权/组成。
它通过修改方法的行为来改变对象的内容。
它用于在algorithm族之间切换。
它在运行时通过在运行时用其他algorithm完全replace一个algorithm来改变对象的行为。
绑定在运行时完成。
相似:
策略和模板方法模式都可以用来满足开闭原则,使得软件模块在不改变代码的情况下易于扩展。
两种模式都表示通用function与该function的详细实现的分离。不过,它们所提供的粒度有一些差异。
差异:
在策略中,客户和策略之间的耦合更加松散,而在模板方法中,两个模块耦合得更紧密。
在策略中,虽然抽象类也可以根据具体情况而使用,但大多使用一个接口,而不使用具体类,而在Template方法中大多使用抽象类或具体类,不使用接口。
在Strategy模式中,类的整体行为一般用接口表示,另一方面,Template方法用于减less代码重复,样板代码在基本框架或抽象类中定义。 在Template Method中,甚至可以有一个具有默认实现的具体类。
简而言之,您可以在策略模式中更改整个策略(algorithm),但是在Template模式中,只有一些事情发生变化(algorithm的一部分),而其余事件保持不变。 在Template Method中,不变步骤是在一个抽象基类中实现的,而变体步骤要么是默认的实现,要么根本就没有实现。 在Template方法中,组件devise器强制执行algorithm所需的步骤和步骤的sorting,但允许组件客户端扩展或replace某些步骤。
实际场景
任何模式,都需要结合实际的场景来讲,才能更清晰。这两个模式,可以在你之前做过的项目中,只要稍微留意一下,应该会发现它们其实是大量存在的,比如很多框架代码,里面有很多固定的执行流程,有些逻辑是可以采用默认处理的方式,有些逻辑需要下游自己去实现,然后有些逻辑还需要提前预留钩子,比如在执行process()流程时,可能需要进行preProcess()的操作,那么这个preProcess()就是你预留的钩子,下游可以实现,也可以不实现。