Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么说类适配器模式在Java中是不可能的?_Java_Design Patterns - Fatal编程技术网

为什么说类适配器模式在Java中是不可能的?

为什么说类适配器模式在Java中是不可能的?,java,design-patterns,Java,Design Patterns,我曾在几个地方提到,类适配器模式不能在Java中实现,包括Head-First:Design模式等等。我不明白为什么 考虑以下适配器、目标接口和适配器代码: 被改编对象 目标接口 对象适配器 类适配器 为什么说类适配器在Java中是不可能的? 原因是Java不支持多重继承 但根据定义,ClassAdapter类正好符合新接口,同时也是adaptee类型。类适配器模式在Java中是可能的。资源: 有一个Java示例 关于这个问题,我问了一个问题: 答案是类适配器。我认为Java不支持对象适配器模式

我曾在几个地方提到,类适配器模式不能在Java中实现,包括Head-First:Design模式等等。我不明白为什么

考虑以下适配器、目标接口和适配器代码:

被改编对象

目标接口

对象适配器

类适配器

为什么说类适配器在Java中是不可能的? 原因是Java不支持多重继承


但根据定义,ClassAdapter类正好符合新接口,同时也是adaptee类型。

类适配器模式在Java中是可能的。资源:

有一个Java示例 关于这个问题,我问了一个问题:


答案是类适配器。

我认为Java不支持对象适配器模式,因为Java不支持多重继承。类适配器模式工作得很好,因为它使用接口,这是Java对多重继承的回答。Java确实支持这里描述的对象适配器模式:他说的是适配器模式的一个特定变体,.No,因为这个变体依赖于多重继承。这就是为什么它不能在java中实现,因为java不支持多重继承。christopher已经在评论中回答了这个问题。@christopher说的与您的相反:我认为Java不支持对象适配器模式,因为Java不支持多重继承。类适配器模式运行良好,因为它使用接口,这是Java对多重继承的回答。@dcastro aliteralmind在这里是正确的;我相信你不小心误读了克里斯托弗的评论。该设计可通过使用接口实现。注意还明确提到:期望的接口通常被创建为纯接口类,特别是在Java等不支持多重继承的语言中。@JasonC我确实误读了aliteralmind的评论,但这意味着他错了。这是直接从报纸上发来的。类适配器使用多重继承,而对象适配器可以很好地实现,因为它使用组合。
class Adaptee{

   int id = 123;

   void doStuff(){ 
     /* Doing stuff */
   }

   int getId(){
       return id;
   }

}
interface TheNewInterface{

     void doAction();

     int getId();
}
class ObjectAdapter implements TheNewInterface{
    Adaptee adaptee;

    ObjectAdapter(Adaptee adaptee){
        this.adaptee = adaptee;
    }

    @Override
    void doAction(){
         adaptee.doStuff();
    }

    @Override
    int getId(){
         adaptee.getId();
    }


}
class ClassAdapter extends Adaptee implements TheNewInterface{

    @Override
    void doAction(){
         doStuff();
    }

    /**No need to provide an implementation of getId() as super class has it implemented*/
}