在Java中实现观察者模式时,避免暴露实现细节?

Hol*_*osa 7 java design-patterns observer-pattern

我从C#来到Java,其中事件是一等公民,事件处理程序可以是私有方法.我现在正在开发一个Java项目,我当然需要使用Observer模式来实现事件.

由于Observer需要将其侦听器/处理程序回调方法暴露给Observable类,因此似乎将Observer的详细信息的实现暴露给其他不关心的类.我可以将这些方法的访问权限设置为包级别,这将使我的包的消费者隐藏这些实现细节,但它仍然有一个糟糕的"气味"给我.

这只是我需要咬牙和裸露的东西还是有更好的方法?

Dav*_*d V 9

使用Observer模式,您观察的类不需要公开它们的实现.通常,通知其他类的类将具有自己的相关接口,以供其他类实现.

public interface Observer
{
    public void handleSomeEvent(Object someObjectOfImportance);
}

public class Observable
{
    public void register(Observer observer);
}
Run Code Online (Sandbox Code Playgroud)

任何类都可以实现Observer接口并注册自己,而不会暴露任何实现细节.它确实暴露了它实现了一个接口,但是没有指定它如何实现它.或者,您可以提供匿名实现.

public class SomeObserverImplementation implements Observer
{
    public void handleSomeEvent(Object someObjectOfImportance)
    {
        // I can do whatever I want here
    }
}
Run Code Online (Sandbox Code Playgroud)

更新 如果您担心您的课程现在正在公开新界面,那么有一些方法可以解决它.一种是创建匿名实现.另一个是你可以拥有一个实现Observable接口的私有内部类.

public class IDontWantOthersToKnowIObserve
{
    private class HiddenObserver implements Observer
    {
        public void handleSomeEvent(Object someObjectOfImportance)
        {
           ...
        }
    }

    ... in some method ...
    theObservable.register(myHiddenObserver);
}
Run Code Online (Sandbox Code Playgroud)

要使用匿名实现:

theObservable.register(new Observer()
            {
                public void handleSomeEvent(Object someObjectOfImportance)
                {
                                // ...
                }
            });
Run Code Online (Sandbox Code Playgroud)