设计模式:解释器和组合模式有什么区别?

12
这两种模式的区别在于实现方式,而非意图上的区别,因为它们显然解决不同的问题。例如,你能否说解释器是一种退化的复合模式?除此之外,还能说些什么关于它们的不同之处吗?
4个回答

7
解释器模式与组合模式关系不大。您可以使用组合模式实现解释器的部分功能 - 例如,这里提供了一个OrExpression的示例:
public class OrExpression extends Expression{
    private Expression expression1 = null;
    private Expression expression2 = null;

    public OrExpression(Expression expression1, Expression expression2) { 
        this.expression1 = expression1;
        this.expression2 = expression2; 
    }

    public boolean interpret(String str) { 
        return expression1.interpret(str) || expression2.interpret(str);
    } 
}

这是组合模式的示例,其中OrExpression由两个其他表达式构成,并且每个表达式的结果传递给布尔or函数。
然而,通常情况下,这只是可能解释器的一小部分 - 它更像是一个高级概念而不是一个简单的组合,并且仅用于相当小众的领域(需要解释任意字符串,可能随后执行命令或表示一组规则)。

4
首先,Interpreter 是一种 行为型 模式,而 Composite 是一种 结构型 模式。这本身就足以说明你应该考虑如何使用它们了。基本上,结构设计模式处理实体之间的关系,使这些实体更容易协同工作。另一方面,行为设计模式用于实体之间的通信,并使这些实体之间的通信更加容易和灵活。

因此,对于你的第一个问题,简单地说是 - 不。

更新: 我找到了一些对你有用的信息

结构模式用于定义系统的静态属性(请参见类图)。

例如:可以使用工厂模式来创建组成系统的实体。您可以拥有具有在 Windows 上与在 OS X 上不同图形属性的 Button 对象。工厂模式将创建 Button,而不考虑操作系统,所创建的对象将在两个操作系统上公开相同的接口,尽管具有不同的内部实现。

行为模式用于定义系统的动态行为(请参见活动、序列等图表)。

示例:适配器模式可以在运行时使用,以透明地允许两个实体之间的接口,它们之间没有共享接口。它有效地改变了对象在运行时的行为。

0

我同意其他答案。

此外,它们是完全不同的模式。就我从课堂上记得的而言;

组合; 我们使用这种模式来生成分层元素。例如家谱,有父母和子女元素,但每个人都有不同的属性,尽管他们都是人(基本)属性,但我们关注的是他们在这种模式下如何相互关联。

解释器:将此模式视为一种编译器。假设您正在实现一个规则引擎,并且您使用语言元素(符号)以不同的方式评估某些内容。例如正则表达式

string item="1500$-240&DSCNT="; var out = item.Evaluate(); //output : 1500$-240$ = 1260$ We applied $240 discount by this text expression


0

Gamma等人花了一些篇幅来比较这两种模式。在讨论解释器模式时,他们说了一件事:

您不必在表达式类中定义Interpret操作。如果创建新的解释器很常见,则最好使用访问者模式将Interpret放入单独的“访问者”对象中。

因此,我从中得出的结论是,组合模式为您提供了实现解释器模式的一种方法,但还有其他方法,包括访问者模式。

我认为它们之间存在显着的重叠。Gamma等人为组合模式提供的示例包含解释器模式的示例,而他们为解释器模式提供的示例也是组合模式的示例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接