【问题标题】:Java alternative Observer PatternJava 替代观察者模式
【发布时间】:2015-05-02 10:20:26
【问题描述】:

在大学的面向对象讲座中,我遇到了一个奇怪的观察者模式,它与我在网上看到的不同。

不是将 Observable 和 Observer 分开在两个不同的对象中,而是一个大对象将两者结合在一起。此外,超级对象还有一个方法,该方法返回观察者(作为句柄)。

我的讲师告诉我,这种实现模式的方式将解决架构问题,如果我们扩展它会导致更新方法爆炸。我想我明白了他的大部分意图。

我现在的问题是,我没有其他来源可以了解这种“替代”观察者模式,或者至少我找不到关于该模式的文章。虽然我认为我明白了我的讲师的意思,但我认为我并不完全理解这种模式,即将所有课程压缩在一起的好处。

谁能详细说明,为什么这种架构会有益于我的代码?或者为什么我不能简单地将更新方法的逻辑提取到实用程序类中?

下面是我们构建的(java)类。我删除了一些不必要的逻辑。

import java.util.Observable;
import java.util.Observer;
import java.util.concurrent.Semaphore;

public class Server implements InterfaceServer {
    public Client client;
    private final ObjServer oServer;

    public Server() {
        oServer = new ObjServer();
        new Thread(server).start();
    }

    public Client connect() throws InterruptedException {
        Client handle = new Client();
        oServer.addObserver(handle);
        return handle;
    }

    public class ObjServer extends Observable implements Runnable {

        @Override
        public void run() {
            while (true) {
                // pull data

                setChanged();
                notifyObservers(m);
            }
        }
    }

    public static class Client implements Observer {

        private Object obj;
        private Semaphore semaphore = new Semaphore(0, true);

        public Object getObject() throws InterruptedException {
            semaphore.acquire();
            System.out.println(obj);

            return obj;
        }

        @Override
        public void update(Observable o, Object arg) {
            obj = arg;
            semaphore.release();
        }

    }

    public static void main(String... args) throws Exception {
        Server server = new Server();

        Client client = new Client();

        client = server.connect();

        while (true) {
            client.getObject();
        }
    }
}

【问题讨论】:

  • Client implements ObserverObjServer extends Observable;它们是单独的类,而不是组合。或者您的意思是它们都被声明/包含在 Server 类中?
  • “一个大对象”包含在词汇上,ObserverObservable. 它没有“将两者结合起来”,也无法解决我能看到的任何具体问题。您需要知道ObserverObservable 在Java 中很少使用。我已经 18 年没用过它们了。
  • 还有个用例,其中观察者可观察混合将是非常合理和适用:例如一种“p2p-observation”。

标签: java observer-pattern


【解决方案1】:

我看不出这与传统的观察者模式有何不同。你仍然有一个可观察对象:ObjServer,和一个观察者对象:Client。并且 observable 有一个添加观察者的方法,它会回调添加的观察者。

如何创建这些对象以及创建它们的人与观察者模式无关。

请注意以下几行:

Client client = new Client();
client = server.connect();

没什么意义。为什么要新建一个Client,然后马上扔掉,把server.connect()返回的client重新赋值给变量?你可以简单地做

Client client = server.connect();

【讨论】:

    猜你喜欢
    • 2011-07-07
    • 2016-02-20
    • 2023-04-10
    • 2012-02-15
    • 2012-12-29
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    相关资源
    最近更新 更多