gpt4 book ai didi

java - Execute around 方法与模板模式的区别

转载 作者:行者123 更新时间:2023-11-30 02:35:41 25 4
gpt4 key购买 nike

我尝试使用 Java 8 Lambda 实现一些 GoF 设计模式。在此练习中,我遇到了围绕方法执行 (EAM) 模式和模板模式。两者似乎有惊人的相似之处。

我读到,EAM 更像是一种没有继承的习惯用法,与使用继承的模板模式相比,大多数示例似乎都是围绕处理资源(open、doSomething、close)。

进一步阅读后,我发现 EAM 似乎在 Smalltalk 中已有历史。

但是,使用 Java 8 Lambda,我们实际上可以摆脱模板模式中的继承并简单地传递行为。实现EAM idiom的解决方案与模板设计模式非常相似。人们也可以将 open,doSomething,close 视为模板模式,open() 和 close() 是相同的步骤,但 doSomething() 是子类化的。使用 Java 8 Lambda,我们可以简单地将 doSomething 的行为传递给接受 java.util.function.Consumer 的函数。这既可以视为 EAM,也可以视为模板模式。

所以我的问题是两者有什么区别?

最佳答案

EAM 更像是 Strategy Pattern在 GoF 设计模式中。策略&Template Method模式都是基于算法的行为模式,但它们有一点不同。

在类中定义为模板方法模式的步骤,您无法在运行时替换其中一个,如果需要,您必须将整个实例替换为另一个子类实例,但使用策略模式,您可以将其替换为另一个策略实例。

策略模式更像是将每个步骤分成单独的策略类型,模板方法是将算法分解为步骤并将步骤推迟到子类。但有时是通过模板方法实现的策略类型。例如:

策略方法

Runnable step1 = ()->{};
Runnable step2 = ()->{};
Runnable step3 = ()->{};

play(step1,step2);
play(step3,step2); //replace step1 with step3

模板方法

class TemplateMethod{
void run(){
step1();
step2();
}

void step1(){}
void step2(){}
}

class Foo extends TemplateMethod{
void step1(){
System.out.println("foo");
}
}

class Bar extends TemplateMethod{
void step1(){
System.out.println("foo");
}
}


TemplateMethod foo=new Foo();
TemplateMethod bar=new Bar();

play(foo);
play(bar);// you must replace steps with another subclass instance

关于java - Execute around 方法与模板模式的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43177994/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com