gpt4 book ai didi

java - 装饰器模式实现——扩展与实现

转载 作者:搜寻专家 更新时间:2023-11-01 01:49:05 24 4
gpt4 key购买 nike

我创建装饰器模式示例:

界面:

public interface Printer {
void print(String message);
}

实现:

public class StringPrinter implements Printer {

public void print(String message) {
System.out.println(message);
}
}

和 2 个装饰器:

将字符串改为大写:

public class UpCasePrinter implements Printer {

private Printer printer;

public UpCasePrinter(Printer printer) {
this.printer = printer;
}

public void print(String message) {
printer.print(message.toUpperCase());
}
}

打印反向字符串:

public class InversePrinter implements Printer {

private Printer printer;

public InversePrinter(Printer printer) {
this.printer = printer;
}

public void print(String message) {
StringBuilder builder = new StringBuilder(message);
printer.print(builder.reverse().toString());
}
}

一切正常。但是当阅读不同站点上的示例时,我发现了不同的实现。每个 decarator extends 来自另一个。并且看到了BufferedInputStream

的实现
BufferedInputStream extends FilterInputStream
FilterInputStream extends InputStream
public abstract class InputStream implements Closeable

我无法理解以下内容:

  1. 创建装饰器的方式有区别吗?对于我 - 装饰器实现与原始类或示例中相同的接口(interface) - 装饰器是 extends 来自另一个装饰器等。link for extends realization

  2. 可能在示例中使用 BufferedInputStream 这样的实现只是因为在开始时选择了抽象类而不是接口(interface)?

编辑:

enter image description here

也就是说,我不明白CarDecorator有什么用

LuxerCarSportsCar 可以实现 Car 接口(interface)并且不扩展 CarDecorator .有什么好处?

最佳答案

BufferedInputStream 的实现方式与您的 Car 示例完全相同。它装饰了一个 InputStream ,虽然它是一个抽象类,但仍然提供一个契约,就像一个接口(interface)一样。在这种情况下选择了一个抽象类,因为有些方法具有默认行为(readskip),并且在编写该类时,接口(interface)无法支持这个(他们现在可以了,但是default methods in 接口(interface)是后来添加的)。

因为契约使用了一个抽象类,BufferedInputStream 扩展了 FilterInputStream,就像 CarDecorator 实现了 Car .两者都只是代表的简单持有者。它们包含一个 protected 字段(一个 InputStream 和一个 Car)并将所有方法调用委托(delegate)给该字段。这样做的原因是,如果你的契约中有大量方法,委托(delegate)每个装饰器中的所有方法可能会导致大量代码重复。如果您的接口(interface)只有一个方法(就像您的接口(interface)那样),那么它提供的好处就很少。

这当然不是装饰者模式的必要组成部分;这只是一种稍微不同的实现方式。您的实现仍然是装饰器模式 100% 正确的实现。

关于java - 装饰器模式实现——扩展与实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51359594/

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