Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/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_Oop_Design Patterns - Fatal编程技术网

Java 可以在具体类上使用适配器模式吗?

Java 可以在具体类上使用适配器模式吗?,java,oop,design-patterns,Java,Oop,Design Patterns,我有两个类似的具体类,它们由两个不同的第三方提供(我不能修改它们) 如果我使用经典的GoF适配器模式,而是让适配器扩展具体的目标类,可以吗?还是这样不好 例如: public class A { public void doSomething() { // some code } } public class B { public void similarDoSomethingMethod() { // some code } } publi

我有两个类似的具体类,它们由两个不同的第三方提供(我不能修改它们)

如果我使用经典的GoF适配器模式,而是让适配器扩展具体的目标类,可以吗?还是这样不好

例如:

public class A {
   public void doSomething() {
      // some code
   }
}

public class B {
   public void similarDoSomethingMethod() {
      // some code
   }
}


public class BAdapter extends A {
   private B b;

   public BAdapter(B b) {
      this.b = b;
   }
   @Overrides
   public void doSomething() {
      b.similarDoSomethingMethod();
   }
}

在这种情况下,我认为扩展是个坏主意。假设您正在围绕以下第三方类实现一个适配器:

class Person {

    public void walk () { ... }

}
如果使用扩展名,则可以编写:

class PersonAdapter extends Person {

}
你可以打一个电话,比如
person.walk()
。太棒了,对吧

但是当你想躲起来走路时会发生什么呢?你必须反对它,或者推翻它——这都是丑陋的解决方案


最好包装类,然后只提供所需函数的接口。

适配器在适配器中提供客户机类a,如果您按照以下说明应用它:

这意味着,如果具体的第三方类不断发展,您可以对客户端进行一些保护

如果您选择扩展A(即,使A的接口成为客户端使用的接口),如果A(您不控制的第三方类)发生更改,您的客户端将被破坏

另外,如果您希望支持新的第三方扩展,如何将其添加到您的设计中


请注意,如果适配器(如上)的“干净”应用程序发生更改,则只有ServiceAdapter将中断。此外,如果您添加新的第三方实现,您只需要创建一个新的适配器并使调整后的服务方法工作。

是一个
BAdapter
是一个
a
?如果是这样,那么这可能是合理的。另外,您确定不调用
super.doSomething()
,并没有破坏
A
的不变量(请记住,实现者并不总是使用
final
和/或文档副作用,因为它们确实应该这样做)?这看起来确实有点代码味道,但是如果没有更多的信息,就不可能给出更多的建议(例如,你为什么需要这个适配器?你能给出一个更具体的例子吗?)我在最初的帖子中忘记了这两个类来自两个不同的第三方。我从使用类a的第三方接收输入,该输入需要发布到使用类B的其他第三方。因此,我接收到类a的实例,但我需要将其转换为类B的实例,以便我可以将其发送给其他第三方。这就是我需要适配器的原因。希望这是有意义的。我的直觉反应是否定的。适配器是用来提供你自己的接口。通过扩展类,可以打开对实际对象的调用。我认为使用
has-a
关系是一个更好的主意。@dalexander06你真正想做的是从
a
B
建立某种桥梁;这本身并没有一个真正的“模式”,但你这样做的逻辑应该在你更高层次的控制逻辑中。同样,如果没有一个具体的例子(例如,您是否轮询
a
B
API是否提供了您可以实现的某种接口?
B
是否拉取数据或您是否真的发布数据?等等),就无法给出可靠的建议。这里没有足够的信息给您提供正确的答案。也就是说,如果
A
没有实现某些接口,您可能必须这样做-这可能是
A
库中的一个设计缺陷,您必须解决它,只要您记录了为什么要这样做,并且100%确定没有其他方法,就可以了。如果这是完成工作的唯一方法,那么偶尔在特殊情况下违反规则是可以的,但是你需要知道你是如何违反规则的,为什么违反规则,你需要证明它的合理性,你需要记录下理由。再一次,请注意我所说的不变量/副作用。如果没有来自OP的更多具体信息,我们所能做的最好的猜测是有误导风险的猜测。