有人可以向我解释模板方法模式和策略模式之间的区别是什么?
据我所知,它们是99%相同 - 唯一的区别是模板方法模式有一个抽象类作为基类,而策略类使用由每个具体策略类实现的接口.
但是,就客户而言,它们的使用方式完全相同 - 这是正确的吗?
有没有人在现实世界的应用程序中使用Bridge Pattern?如果是这样,你是如何使用它的?是我,还是仅仅是适配器模式,在混合中引入了一点依赖注入?它真的值得拥有自己的模式吗?
我一直在阅读有关OCP主要内容以及如何使用策略模式来实现这一目标.
我打算尝试向几个人解释这个,但我能想到的唯一例子是根据"订单"的状态使用不同的验证类.
我在线阅读了几篇文章,但这些文章通常没有描述使用该策略的真实原因,如生成报告/账单/验证等...
是否有任何现实世界的例子,您认为策略模式是常见的?
我知道之前已经问过这个问题(例如,桥梁模式和策略模式之间有什么区别?).
但是,有人可以使用明确的例子解释,区别的是什么,以及在哪种情况下必须选择另一种情况?更少概念理论,更实际的"现实生活"情景将不胜感激.
我知道,这个问题被多次询问,但我做了一些研究,但仍然没有得到它,可能你可以帮助我:正如很多次说的那样,UML几乎是一样的.此外,实现和想法或多或少相同:您可以定义一个Interface,而不是子类型,它封装了一些逻辑,让它传递给一个抽象.所以,即使是微软博客的人
简单的答案是"它们相似但不同".实现类似但意图不同.举一个类比,城市公交车和校车都是类似的车辆,但它们用于不同的目的.一种用于在城市的各个部分之间运送人员作为通勤服务.另一个用于将孩子送到学校.
"如果它看起来像一只鸭子,看起来像一只鸭子,但它打算成为一只天鹅,它可以是其中之一",这就是我在这里读到的.
因为我还没有得到它,所以我深入挖掘:
此线程也不添加任何新内容,除了:
它们在表面上看起来也一样.我看到的主要区别在于,在Bridge模式中,抽象是对象的PART,但在Strategy模式中,抽象是由对象执行的.
但是,如果我们阅读战略的定义:
定义一系列算法,封装每个算法,并使它们可互换.策略允许算法独立于使用它的客户端.
没有任何定义,如何应用该战略.它也可以很容易地成为摘要上的接口,与LINQ-Orderby等常见的策略实现完全相同.
关于这个主题的另一个兴趣是:
http://game-engineering.blogspot.ch/2008/07/bridge-pattern-vs-strategy-pattern.html
这个话题的主要部分:
当你想要改变行为时,你会说"策略",而你不是通过编写不同的对象而是通过引入类层次来实现.当您希望改变界面和实现时,您会说"Bridge".在这两种情况下,您都可以为不断变化的实施提供灵活性; 在Bridge中,您还希望界面能够改变.
这可能是主要区别吗?由于执行器和抽象是如此松散耦合,我可以改变执行器的接口,抽象不必关心?这听起来很合理,但是由于它们是有联系的,所以也不会有抽象改变吗?这不会破坏信息隐藏和DRY等所有其他原则吗?
我还看了很多例子,我不会为了这个地方而添加这些例子,我找不到这些模式的例子,我无法改变以适应另一个.无论是通过Interface-Property还是参数.
我在这里错过了吗?可能任何人都有一个真实生活的例子"我想使用策略,但Bridge确实更合适",反之亦然,例如?
编辑:为什么我为这个主题辩护(再次)?首先,所提到的线程的接受答案如下
据我了解,当你抽象出可以从外部源提供的行为时(例如,config可以指定加载一些插件程序集),你正在使用策略模式,并且当你使用时你正在使用桥接模式相同的结构使你的代码更整洁.实际的代码看起来非常相似 - 你只是因为略有不同的原因而应用这些模式.
我在之前的解释中已经提到,外部源的抽象行为正是Strategy-和Bridge-Pattern的定义.
也
当你使用相同的结构使你的代码更整洁时,你正在使用桥接模式.
此外,策略模式使代码更整洁,因为它将整个构建块抽象出来,从而使代码收紧了很多.
我想任何阅读整个主题的人都会看到,这个主题的内容比这2个句子更多.
今天,我的困境来自于试图理解为什么战略和桥梁模式的实施方式存在重叠.
这是Bridge Pattern(从抽象中抽象出一个实现)
// Shapes object structure will not be concerned how they draw themselves
public abstract class Shape {
protected DrawAPI drawAPI;
protected Shape(DrawAPI drawAPI){
this.drawAPI = drawAPI;
}
// This could also be put in the subcla
public void draw() {
drawAPI.drawCircle(radius,x,y);
}
}
Run Code Online (Sandbox Code Playgroud)
现在是策略模式 - 可以在运行时更改类行为或其算法.计算器会将其操作委派给策略
public class Calculator{
private Strategy strategy;
public Calculator(Strategy strategy){
this.strategy = strategy;
}
public int executeStrategy(int num1, int num2){
return strategy.doOperation(num1, num2);
}
}
Run Code Online (Sandbox Code Playgroud)
这两种模式都涉及丢弃封装功能的策略对象.请帮助解决桥梁模式(结构)和战略模式(行为)之间的明显差异.我遇到的另一个困惑是他们处于不同的知识范围内.