在Java中实现观察者模式时避免暴露实现细节?
我是从C#来到Java的,在C#中,事件是第一类公民,事件处理程序可以是私有方法。我现在正在从事一个Java项目,在这个项目中,我当然需要使用观察者模式来实现事件 由于观察者需要向可观察类公开其侦听器/处理程序回调方法,因此这似乎是向其他无关类公开观察者细节的实现。我可以将对这些方法的访问权限设置为包级别,这将使这些实现细节对我的包的使用者隐藏,但它对我来说仍然有一种不好的“气味”在Java中实现观察者模式时避免暴露实现细节?,java,design-patterns,observer-pattern,Java,Design Patterns,Observer Pattern,我是从C#来到Java的,在C#中,事件是第一类公民,事件处理程序可以是私有方法。我现在正在从事一个Java项目,在这个项目中,我当然需要使用观察者模式来实现事件 由于观察者需要向可观察类公开其侦听器/处理程序回调方法,因此这似乎是向其他无关类公开观察者细节的实现。我可以将对这些方法的访问权限设置为包级别,这将使这些实现细节对我的包的使用者隐藏,但它对我来说仍然有一种不好的“气味” 这是我需要咬紧牙关解决的问题,还是有更好的方法?使用观察者模式,您正在观察的类不需要公开它们的实现。通常,通知其他
这是我需要咬紧牙关解决的问题,还是有更好的方法?使用观察者模式,您正在观察的类不需要公开它们的实现。通常,通知其他类的类将有自己的关联接口供其他类实现
public interface Observer
{
public void handleSomeEvent(Object someObjectOfImportance);
}
public class Observable
{
public void register(Observer observer);
}
任何类都可以实现Observer
接口并注册自身,而无需公开任何实现细节。它确实公开了它实现了一个接口,但没有指定它如何实现它。或者,您可以提供匿名实现
public class SomeObserverImplementation implements Observer
{
public void handleSomeEvent(Object someObjectOfImportance)
{
// I can do whatever I want here
}
}
更新
如果您担心您的类现在正在公开一个新接口,那么有一些方法可以解决这个问题。一种是创建匿名实现。另一个是您可以有一个私有的内部类来实现可观察的接口
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中,这通常不被认为是真正公开实现细节,但是,如果您真的想对其他类隐藏您的类的功能,那么您需要让您的类实现不同的接口,每个接口只公开整个类功能的一个子集。如果您随后确保其他类仅通过特定接口(可能通过工厂)访问您的类,那么您将有效地隐藏您的实现
public class SomeObserverImplementation implements Observer
{
public void handleSomeEvent(Object someObjectOfImportance)
{
// I can do whatever I want here
}
}
例如:
公共接口观察者
{
公共无效通知(T事件);
}
公共界面PublicFace
{
公共无效剂量();
}
公共类SomeClass实现了Observer、PublicFace
{
公共无效通知(事件)
{
// ...
}
公共无效剂量测定法()
{
// ...
}
}
公共类FaceFactory
{
public静态PublicFace getPublicFaceInstance()
{
返回新的SomeClass();
}
}