这可能是一个新手问题,因为我是设计模式的新手,但我正在查看模板方法和策略DP,它们看起来非常相似。我可以阅读定义,检查UML并查看代码示例,但对我来说,似乎策略模式只是使用模板方法模式,但你恰好将它传递给对象(即组合)。
就此而言,模板方法似乎只是基本的OO继承。
我错过了他们差异的一些关键方面吗?我是否遗漏了一些关于模板方法的内容,使其更像是基本继承?
注意:此前有一篇帖子(672083),但更多的是关于什么时候使用它,哪种方式可以让我更多地了解它,但我想要对模式本身有所了解。
答案 0 :(得分:10)
它基本上都归结为语义。策略模式允许您将特定的算法/过程(策略)传递给另一个对象,并将使用它。模板方法允许您覆盖算法的特定方面,同时仍然保持它的某些方面相同(保持顺序相同,并且总是在开始和结束处完成的事情,例如......'模板')而继承是一种在数据模型中建模“IS-A”关系的方法。
当然,模板方法最容易使用继承实现(尽管你可以很容易地使用组合,特别是一旦你有了仿函数),策略模式通常也是模板方法,但语法类似,其含义却截然不同。
答案 1 :(得分:1)
Strategy设计模式
提供了一种交换对象算法的方法
在运行时动态地
(通过对象组合)。
例如,计算订单处理系统中的价格 以不同方式计算价格, 可以支持不同的定价算法 这样可以选择(注入)使用哪种算法并在运行时动态交换。
Template Method
设计模式
提供了一种方法
在编译时静态重新定义类的行为的某些部分
(通过子类化)。
例如,设计可重用的应用程序(框架) 应用程序实现行为的公共(不变)部分 以便应用程序的用户可以编写子类来重新定义 变体零件以满足他们的需求。 但是子类编写者既不应该改变它的不变部分 行为和行为的结构 (不变量和变体部分的结构)。