gpt4 book ai didi

design-patterns - 具有复合设计模式的装饰器设计模式

转载 作者:行者123 更新时间:2023-12-05 01:57:29 25 4
gpt4 key购买 nike

我了解复合设计模式和装饰器设计模式及其用途。我们可以有一个我们必须一起使用它们的情况吗?这种场景的类图会是什么样子?

我们是否会从组件继承装饰器(来自装饰器设计模式)、叶节点和复合 Material (来自复合设计模式)?这是我指的装饰器模式:wiki link for decorator pattern对于复合模式:composite wiki link

最佳答案

装饰器在装饰单个对象的同时委托(delegate)其方法并因此修改其行为。考虑一个接口(interface) Text 和一个方法 String asString(); 一个示例类,例如 TrimmedText, UpperCaseText,和 LowerCaseText

复合 Material 是零到 n 对象的容器,仅将行为委托(delegate)给其子对象。

然而,这些可以组合成一个叫做复合装饰器的东西,相对于前面的例子,它是ConcatenatedText

下面是一些代码,证明复合类也可以充当装饰器并自身被装饰:

interface Text {
String asString();

// just a static helper to construct an instance of Text quickly
static Text of(String text) {
return () -> text;
}
}
// 1st decorator
@AllArgsConstructor
static class TrimmedText implements Text {
Text text;

@Override
public String asString() {
return text.asString().trim();
}
}

// 2nd decorator
@AllArgsConstructor
static class UpperCaseText implements Text {
Text text;

@Override
public String asString() {
return text.asString().toUpperCase();
}
}
// composite decorator
@AllArgsConstructor
static class ConcatenatedText implements Text {
List<Text> texts;

public void add(String text) {
texts.add(Text.of(text));
}

@Override
public String asString() {
return texts.stream().map(Text::asString).collect(Collectors.joining(", "));
}
}
@Test
void foo() {
Text trimmedUpperCaseText = new TrimmedText(new UpperCaseText(Text.of(" a b c ")));
assertThat(trimmedUpperCaseText.asString(), is("A B C"));

ConcatenatedText concatenatedText = new ConcatenatedText(new ArrayList<>(List.of(
new UpperCaseText(Text.of(" a ")),
new TrimmedText(Text.of(" b ")))));

concatenatedText.add("c");

Text refinedText = new TrimmedText(concatenatedText);

assertThat(refinedText.asString(), is("A , b, c")
}

关于design-patterns - 具有复合设计模式的装饰器设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69286561/

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