首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >观察者模式:状态通知

观察者模式:状态通知
EN

Stack Overflow用户
提问于 2016-11-28 19:06:07
回答 2查看 2.6K关注 0票数 1

我在互联网上看到的例子只给出了可观察对象的notifyObservers()方法。如果我也想把一些数据传递给观察者,让他们知道他们是否应该对此做出反应呢?观察者模式是否允许传递数据,比如:

notifyObservers(Event e)

或者也许观察者自己应该拉变化?也许吧:notifyObservers() -> call observer.update()

然后每个观察者决定新的数据是否与他们相关,observable.getData()。然而,使用这种方法,我不清楚如何只获取有更改的数据,如果需要的话。

编辑,示例:

说我想开一家有司机、客户和出租车的出租车公司。根据@Pritam Banerjee的回答,我会说出租车公司是运营商和客户之间的中间人(例如,为什么-客户可以通过电话或在线呼叫出租车)。我的接线员是主体,出租车是观察者。

Operator ---observes---> TaxiFirm

TaxiFirm(waits for client) ---notifies one---> Operator (公司选择哪个运营商负责,并将客户传递给运营商)

Taxi ---observes all---> Operators (需要在这里推送数据,如果出租车被占用,它就不能接受新的客户端)

Taxi ---notifies---> Operator (如果出租车能接受客户端,它会通知运营商,我不担心任何比赛条件,因为这个事件将手动触发。另外,也许出租车应该通知公司而不是经营者?)

我认为TaxiFirm可能不需要将客户端传递给操作员,但是考虑到现实生活,真正与客户交谈的是操作员.

我已经写下了我的思考过程,请帮我弄清楚这个模型的架构。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-29 16:57:45

当然,ObserverPattern允许您通过其notify方法传递信息。如果出租车需要客户信息,你可以直接通过:

代码语言:javascript
复制
observer.notify(ClientInfo info)

当然,观察员可以要求提供以下信息:

代码语言:javascript
复制
observer.notify()

void notify() {
    update();
}

这两种方法都是可能的,但我不会说您这里真的有ObserverPattern。根据这种模式,主题只需通知所有的观察者。但你所描述的是,当事人应通知其中一辆出租车,等待其答复(如果出租车已经载有乘客),然后可能通知下一辆出租车。你可以称它为ObserverPattern的变体,但这是不同的。

一个简单的建议,让你开始:

类运算符:

代码语言:javascript
复制
List<Taxi> taxis;

boolean chooseTaxi(RideNumber rideNumber) {
    for (Taxi taxi : taxis) {
        boolean isAccepted = taxi.notify(this, rideNumber);
        if (isAccepted) {
           markTaxiRideAsAccepted(taxi, rideNumber);
           return true;
        }
    }
    return false; // No taxi accepted the ride.
}

级出租车:

代码语言:javascript
复制
boolean notify(Operator operator, RideNumber rideNumber) {
    if (isTaxiAlreadyCarryingPassenger()) return false;

    ClientInfo clientInfo = operator.getClientInfo(this, rideNumber);
    startClientProcess(clientInfo);

    return true;
}

注意:RideNumber只是一个识别号,出租车后来使用它向操作员请求客户信息。相反,您可以通过notify方法发送clientInfo,但是所有的出租车都会得到这个信息,这对安全性来说很糟糕,而且可能会让人感到困惑(发送不应该使用的信息)。

更新:

如果这是作业作业,并且必须使用精确的ObserverPattern,您可以这样做:

类运算符:

代码语言:javascript
复制
List<Taxi> taxis;

void notifyAllTaxis(RideNumber rideNumber) {
    for (Taxi taxi : taxis) {
        taxi.notify(this, rideNumber);            
        }
    }        
}

ClientInfo getClientInfo(this, rideNumber) {
    if (isRideNotYetAccepted(rideNumber)) {
        markRideAsAccepted(taxi, rideNumber);
        return getClientInfo(rideNumber);
    }
    else return null;
}

级出租车:

代码语言:javascript
复制
void notify(Operator operator, RideNumber rideNumber) {
    if (!isTaxiAlreadyCarryingPassenger()) {

        ClientInfo clientInfo = operator.getClientInfo(this, rideNumber);
        if (clientInfo != null) startClientProcess(clientInfo);
    }
}
票数 1
EN

Stack Overflow用户

发布于 2016-11-28 19:12:33

您可以将观察者设计模式Mediator模式结合使用,以便应用程序还可以订阅数据并将数据发布到其他相关应用程序。

关于这方面的一个例子,您可以查看这里

有关Mediator设计模式的详细信息,您可以阅读此文章

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40851640

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档