Java中无继承的观察者模式

Java中无继承的观察者模式,java,runnable,observer-pattern,Java,Runnable,Observer Pattern,在没有基类/接口的情况下实现Observer模式有什么问题,例如使用Runnable: public ObservableClass { List<Runnable> observers; public void add(Runnable r) { observers.add(r); } public void notify() { // forloop and observers[i].run(); } } public ObserverClass {

在没有基类/接口的情况下实现Observer模式有什么问题,例如使用Runnable:

public ObservableClass
{
    List<Runnable> observers;
    public void add(Runnable r) { observers.add(r); }
    public void notify() { // forloop and observers[i].run(); }
}

public ObserverClass
{
    ObservableClass observable;
    public void listen()
    {
       observable.add(new Runnable() {
           @Override
            public void run() {
               // do something here
            }
       });
    }
}
公共电子课堂
{
观察员名单;
public void add(Runnable r){observer.add(r);}
public void notify(){//forloop和观察者[i]。运行();}
}
公共观察者类
{
可观察的,可观察的;
公共图书馆
{
添加(新的Runnable(){
@凌驾
公开募捐{
//在这里做点什么
}
});
}
}
我在问问题,这是“丑陋”还是“懒惰”。
例如,我看到的一个问题是,我们不能直接将数据传递给观察者(但如果我们可以在Observable中访问该数据,那么我们仍然可以在RUnnable中使用它)


使用这样的代码而不是创建一个可观察的基类和一些观察者接口的缺点是什么?

您可以始终使用
Callable
,而不是
Runnable
,除非实现类实际上被设计为由用户执行,否则我不会使用
Callable
Runnable
线程(或执行器服务)。Java及其类的一大优点是类型安全。在设计软件时,这应该是您的首要任务,使类实际上表示需要代码以不同方式处理的不同事物。实际上,您所做的只是将通常称为
Observer
接口/抽象类替换为信息量较少且更可能被错误使用的
Runnable
,这意味着您不需要这样做“在没有基类/接口的情况下实现观察者模式”。@d.j.brown是的,但我们不需要扩展任何类以使其“可观察”(如果没有多重继承,则特别有用),我们也不需要在观察者类中实现任何自定义接口,只需添加我们想要执行的方法。