如何依赖列表的通用性到实现子类



目前我有以下类:

public abstract class Entity 
{
    private final String id; 
    private String name;
    protected List <CustomerListener> listenerList = new ArrayList<>();
    public void addEntityListener (CustomerListener listener)
    {
        listenerList.add(listener);
    }
    public void setName (String name)
    {
        this.name = name; 
        listenerList.forEach(listener) -> 
        {
            listener.nameChanged(name);
        }
    }
    //Imagine a constructor and some getter ... ;) 
}
public class Customer extends Entity
{
    private String company;
    private String businessUnit;
    private String position;
    public void setCompany (String company)
    {
        this.company = company; 
        listenerList.forEach(listener) -> 
        {
            listener.companyChanged(company);
        }
    }
    //Imagine  a construtor and some more getter and setter.
}

以下接口实例存储在上面的阵列列表中:

public abstract interface EntityListener
{
    void nameChanged (String name);
}
public interface CustomerListener extends EntityListener
{
    void businessUnitChanged (String businessUnit);
    void companyChanged (String company);
    void positionChanged (String position);
}

我的意图是,我想以不同的方式处理每个值更改为客户实例或其他实体或客户继承实例的其他值。我的问题是,我只想只有一个列表来存储这些听众。我的想法是在超级阶级实体"实体"中创建它。但是我不能使用" entityListener"的侦听器的基础类型,因为那时我无法从其子界面调用这些方法。

我只能创建一个单个列表来存储所有侦听器。但是存储在此列表中的类型应取决于使用了哪些子类?我的设计模式是否可以做到这一点?

这很重要,因为我想将层次结构扩展到其他类。

我尝试过的一种解决方案是,我在客户类中创建了void addcustomerlistener(customerListener侦听器(,但这会产生相同的问题。

正如Lino在评论中所说的那样,您需要生成您的实体类。

class Entity<L extends EntityListener> {
    protected List<L> listenerList = new ArrayList<>();
    public void addEntityListener(L listener) {
        listenerList.add(listener);
    }
}
class Customer extends Entity<CustomerListener> {
}
interface EntityListener {
    void nameChanged(String name);
}
interface CustomerListener extends EntityListener {
    void businessUnitChanged(String businessUnit);
    void companyChanged(String company);
    void positionChanged(String position);
}

但是,我会选择其他选项,例如选择CustomerService并让服务接受并通知听众,因此您可以将逻辑(观察/侦听(从域类中分离出来。

最新更新