我最近学习了类适配器模式.为了实现它,所使用的语言必须支持多重继承,因为适配器类必须继承两个类:Target和Adaptee.因此,在像Java这样的语言中,这是做不到的.

但是为什么它不能使用接口Target而不是类Target呢?也更符合对象适配器模式.只是从对象组合(具有适配器的Adapter)切换到单一继承(Adapter继承Adapteer). 通过使用接口,我看不到设计差异,因此,该模式可以在Java中使用.

Link to object adapter and class adapter class diagram

推荐答案

但是为什么它不能使用接口Target而不是类Target呢?

您可以使用接口.但是,您将拥有重复的代码,但是多重继承消除了重复的代码.

让我举一个例子.

我们的抽象:

public interface IDuck
{
    void Quack();
}

public interface ITurkey
{
    void Gobble();
}

和具体实施:

public class Duck : IDuck
{
    public void Quack()
    {
        Console.WriteLine("Quack");
    }
}

public class Turkey : ITurkey
{
    public void Gobble()
    {
        Console.WriteLine("Gobble");
    }
}

而类适配器将如下所示:

public class ClassAdapter : IDuck, ITurkey
{
    public void Gobble()
    {
        // duplication of code
        Console.WriteLine("Gobble");
    }

    public void Quack()
    {
        Gobble();
    }
}

以上ClassAdapter个有重复的代码.当然,我们可以提取此代码,并通过组合或注入Duck和土耳其来提供它.然而,它带来了额外的依赖关系和一些复杂性.因此,最好使用对象适配器模式.您的代码将变得更简单.简单的代码几乎总是最佳 Select .

Java相关问答推荐

Javascript更新alert 可扩展内容样式与CSS—按钮更多/更少

scanner 如何在执行hasNextLine一次后重新读取整个文件?

CompleteableFuture是否运行在不同的内核上?

Jakarta CDI强制bean构造/注册遗留事件侦听器

如何从JNI方法正确调用NSOpenPanel以在正确的线程上运行?

如何让JVM在SIGSEGV崩溃后快速退出?

使用OAuth 2.0资源服务器JWT时的授权(授权)问题

如何在JavaFX中处理多个按钮

如何在代码中将行呈现在矩形前面?

使用正则表达式从字符串中提取多个值

AbstractList保证溢出到其他方法

Android Studio模拟器没有互联网

为什么mvn编译生命周期阶段不只是编译已更改的java文件?

在Java中将对象&转换为&q;HashMap(&Q)

AspectJ编织外部依赖代码,重新打包jar并强制依赖用户使用它

Spring Boot Security-每个端点都被403禁止,Spring记录一个BasicErrorController#错误(HttpServlet请求)

Maven创建带有特定类的Spring Boot jar和普通jar

如何使用命令行为Java应用程序生成烟雾测试用例

如何使用Jackson读取以方括号开头的JSON?

如何在 Android Studio 中删除 ImageView 和屏幕/父级边缘之间的额外空间?