首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >避免在同一个对象中实现大量角色

避免在同一个对象中实现大量角色
EN

Software Engineering用户
提问于 2015-05-26 18:22:04
回答 1查看 368关注 0票数 1

动机

让一个项目.

..。存在很多不同的行为。对于每一种行为,都有一个有其可能操作的接口。一个对象可以执行很多不同的行为。

通常,协作者"A“只关心来自特定对象的接口"I”。

因此,如何避免对象实现大量的角色。

示例:

代码语言:javascript
复制
public class MyComplexObject implements Closeable, Reliable, Trustable, Treable, Moveable { ...}

为什么要麻烦?

作文解决了这个问题。但只有部分。在Java中,目标对象仍然必须委托目标实现的问题调用。虽然它不是大脑实现,但当角色列表超过5个时,它就不舒服了。

继承(通过接口)不会使事情变得更好。

让我们假设6个不同的接口(每个接口有5个方法)。现在,让我们简化并设想一下这些接口的默认实现。现在,假设一组更复杂的对象可以实现其中的一到六个接口。这意味着2^6= 64种不同的可能组合。此外,长的接口列表意味着内部方法的长列表。

显然,在这种情况下,使用BaseImplementation进行继承是没有意义的。

示例:

代码语言:javascript
复制
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的概念

代码语言:javascript
复制
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的

代码语言:javascript
复制
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);    
EN

回答 1

Software Engineering用户

发布于 2015-05-26 22:31:23

从注释和编辑中可以看出,您更关心的是在多个实现类中复制代码。这与实现了多少接口无关。

带有委托

组合模式

如果每个接口的实现都是通用的,那么它们应该是委托给使用Composite模式的类。无论哪种方式,适配器模式都不是解决方案。

如果是A implements C,那么A就是C。将调用代码与Adapter模式混淆在一起是一个糟糕的API决定。

你问的问题不是正确的:

..。如何避免对象实现长的接口列表。

我认为你看到了一个只存在于你身上的问题。自1995年以来,我已经完成了数亿行Java代码的工作。我从未见过你所关心的问题。

接口组合的数量不是一个实际问题。从来没有过。如果您对许多方法有太多的接口,那么这是一个需要修复的设计问题,您的解决方案不是这个解决方案。

--你增加了一种荒谬的复杂性,却没有明显的好处:

implements意味着实现该接口的是一种关系,这种关系是紧密耦合的,引入Adapter模式类型间接会使代码库变得更加复杂,需要维护和测试,这是一个足够好的理由不这样做。

如果这是一种很好的方法,那么作为开放源码库( Java已经存在了20年),它已经做了六次了。

您试图使用的这个Adapter模式不是正确的方法,它将创建一个沉重的负担API,并且非常脆弱。

使用API的工作将比维护天真的重复代码付出更大的努力。

票数 9
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/285006

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档