Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中实现观察者模式时避免暴露实现细节?_Java_Design Patterns_Observer Pattern - Fatal编程技术网

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

在Java中实现观察者模式时避免暴露实现细节?,java,design-patterns,observer-pattern,Java,Design Patterns,Observer Pattern,我是从C#来到Java的,在C#中,事件是第一类公民,事件处理程序可以是私有方法。我现在正在从事一个Java项目,在这个项目中,我当然需要使用观察者模式来实现事件 由于观察者需要向可观察类公开其侦听器/处理程序回调方法,因此这似乎是向其他无关类公开观察者细节的实现。我可以将对这些方法的访问权限设置为包级别,这将使这些实现细节对我的包的使用者隐藏,但它对我来说仍然有一种不好的“气味” 这是我需要咬紧牙关解决的问题,还是有更好的方法?使用观察者模式,您正在观察的类不需要公开它们的实现。通常,通知其他

我是从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();
}
}