Java 可以在具体类上使用适配器模式吗?
我有两个类似的具体类,它们由两个不同的第三方提供(我不能修改它们) 如果我使用经典的GoF适配器模式,而是让适配器扩展具体的目标类,可以吗?还是这样不好 例如: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
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的更多具体信息,我们所能做的最好的猜测是有误导风险的猜测。