让一个项目.
..。存在很多不同的行为。对于每一种行为,都有一个有其可能操作的接口。一个对象可以执行很多不同的行为。
通常,协作者"A“只关心来自特定对象的接口"I”。
因此,如何避免对象实现大量的角色。
示例:
public class MyComplexObject implements Closeable, Reliable, Trustable, Treable, Moveable { ...}作文解决了这个问题。但只有部分。在Java中,目标对象仍然必须委托目标实现的问题调用。虽然它不是大脑实现,但当角色列表超过5个时,它就不舒服了。
继承(通过接口)不会使事情变得更好。
让我们假设6个不同的接口(每个接口有5个方法)。现在,让我们简化并设想一下这些接口的默认实现。现在,假设一组更复杂的对象可以实现其中的一到六个接口。这意味着2^6= 64种不同的可能组合。此外,长的接口列表意味着内部方法的长列表。
显然,在这种情况下,使用BaseImplementation进行继承是没有意义的。
示例:
public class MyComplexObject1 implements Closeable, Reliable, Trustable, Treable, Moveable { ...}
public class MyComplexObject2 implements Reliable, Treable, Moveable { ...}
public class MyComplexObject3 implements Reliable, Trustable, Moveable { ...}
public class MyComplexObject4 implements Closeable, Trustable, Treable { ...}“持怀疑态度”,“避免复杂性”,当然,这些东西是好的。不过,太笼统了。这个问题是当长时间的角色列表受伤的时候。因此,这是一个角落的情况,而不是一个主流的问题。
这并不意味着不切实际的情况。有一个项目使用一个可以用来解决这个问题的想法。
Netbeans,这有cookies的概念
EditorCookie ec = activatedNodes[0].getLookup().lookup(EditorCookie.class);cookie是一种功能,cookie是NetBeans的一个强大特性。使用Java接口,您的对象的功能在编译时是固定的,而NetBeans cookie允许您的对象动态地运行,因为您的对象可以根据其状态公开功能。
https://platform.netbeans.org/tutorials/60/nbm-porting-basic.html
如何实现类似cookies的
public class MyComplexObject {
private Map<Class<?>, ?> adapters;
public <T> T getAdapterIfApplicable(Class<T> t){
return (T) adapters.get(t);
}
public MyComplexObject add(Class<T> aClass, T t){
adapters(aClass, t);
t.setTarget(this);
}
...
}
...
public CloseableAdapter implements Adapter{
void setTarget(Object target){
this.target = target;
}
}
...
new MyComplexObject().add(CloseableAdapter.class, aCloseAdapter); 发布于 2015-05-26 22:31:23
从注释和编辑中可以看出,您更关心的是在多个实现类中复制代码。这与实现了多少接口无关。
带有委托
组合模式
如果每个接口的实现都是通用的,那么它们应该是委托给使用Composite模式的类。无论哪种方式,适配器模式都不是解决方案。
如果是A implements C,那么A就是C。将调用代码与Adapter模式混淆在一起是一个糟糕的API决定。
..。如何避免对象实现长的接口列表。
我认为你看到了一个只存在于你身上的问题。自1995年以来,我已经完成了数亿行Java代码的工作。我从未见过你所关心的问题。
接口组合的数量不是一个实际问题。从来没有过。如果您对许多方法有太多的接口,那么这是一个需要修复的设计问题,您的解决方案不是这个解决方案。
implements意味着实现该接口的是一种关系,这种关系是紧密耦合的,引入Adapter模式类型间接会使代码库变得更加复杂,需要维护和测试,这是一个足够好的理由不这样做。
如果这是一种很好的方法,那么作为开放源码库( Java已经存在了20年),它已经做了六次了。
您试图使用的这个Adapter模式不是正确的方法,它将创建一个沉重的负担API,并且非常脆弱。
使用API的工作将比维护天真的重复代码付出更大的努力。
https://softwareengineering.stackexchange.com/questions/285006
复制相似问题