Hol*_*osa 7 java design-patterns observer-pattern
我从C#来到Java,其中事件是一等公民,事件处理程序可以是私有方法.我现在正在开发一个Java项目,我当然需要使用Observer模式来实现事件.
由于Observer需要将其侦听器/处理程序回调方法暴露给Observable类,因此似乎将Observer的详细信息的实现暴露给其他不关心的类.我可以将这些方法的访问权限设置为包级别,这将使我的包的消费者隐藏这些实现细节,但它仍然有一个糟糕的"气味"给我.
这只是我需要咬牙和裸露的东西还是有更好的方法?
使用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)