在Java中实现观察者模式时避免暴露实现细节?
问题描述:
我来自C#中的Java,其中事件是头等公民,事件处理程序可以是私有方法。我现在正在研究一个Java项目,我当然需要使用Observer模式来实现事件。在Java中实现观察者模式时避免暴露实现细节?
由于观察员需要公开其监听器/处理器回调方法的可观察类的,似乎这是暴露实施观察员到其他漠不关心类的细节。我可以将这些方法的访问权限设置为包级别,这样可以将这些实现细节隐藏给我的包的消费者,但它仍然对我有不好的“味道”。
这只是我需要磨牙和裸露或有更好的方法吗?
答
使用Observer模式,您正在观察的类不需要公开其实现。通常你的类通知其他类将有其自己的相关接口供其他类实现。
public interface Observer
{
public void handleSomeEvent(Object someObjectOfImportance);
}
public class Observable
{
public void register(Observer observer);
}
任何类都可以实现接口并注册自己,而不公开任何实现细节。它确实暴露了它实现了一个接口,但是它没有指定它是如何实现它的。或者,您可以提供匿名实现。
public class SomeObserverImplementation implements Observer
{
public void handleSomeEvent(Object someObjectOfImportance)
{
// I can do whatever I want here
}
}
更新 如果你担心自己的班级,现在是暴露出一个新的接口有一些方法来解决它。一个是创建一个匿名实现。另一个是你可以拥有一个实现Observable接口的私有内部类。
public class IDontWantOthersToKnowIObserve
{
private class HiddenObserver implements Observer
{
public void handleSomeEvent(Object someObjectOfImportance)
{
...
}
}
... in some method ...
theObservable.register(myHiddenObserver);
}
使用匿名实现:
theObservable.register(new Observer()
{
public void handleSomeEvent(Object someObjectOfImportance)
{
// ...
}
});
答
在Java中,这是通常不认为是真正暴露的实现细节,但是,如果你真的想隐藏你的类从其他类功能那么你需要让你的类实现不同的接口,每个接口只公开整个类功能的一个子集。如果再保证其他类只能通过一个特定的接口(可能通过工厂)访问你的类,那么你有效地隐藏你的实现。
E.g:
public interface Observer<T>
{
public void notify(T event);
}
public interface PublicFace
{
public void doSomething();
}
public class SomeClass implements Observer<Event>, PublicFace
{
public void notify(Event event)
{
// ...
}
public void doSomething()
{
// ...
}
}
public class FaceFactory
{
public static PublicFace getPublicFaceInstance()
{
return new SomeClass();
}
}
谢谢!很好的答案! – HolySamosa 2012-01-06 21:49:15