gpt4 book ai didi

java - 观察者模式: notify with state

转载 作者:行者123 更新时间:2023-11-30 02:43:45 28 4
gpt4 key购买 nike

我在互联网上看到的示例只为 Observable 对象提供了 notifyObservers() 方法。如果我还想将一些数据传递给观察者,以便他们知道是否应该对此使用react,该怎么办?观察者模式是否允许传递数据,例如:

notifyObservers(事件 e)

或者也许观察者自己应该做出改变?也许就像:notifyObservers() -> 调用observer.update()

然后每个观察者决定新数据是否与他们相关,observable.getData()。然而,通过这种方法,我不清楚如何仅获取发生变化的数据(如果需要的话)。

编辑,示例:

假设我想成立一​​家出租车公司,拥有运营商、客户和出租车。根据@Pritam Banerjee的回答,我会说出租车公司是运营商和客户之间的调解人(例如为什么 - 客户可以通过电话或在线叫出租车)。那么我的运营商是主体,出租车是观察者。

运算符(operator) ---观察--->出租车公司

TaxiFirm(等待客户)---通知一个--->运算符(operator)(公司选择负责的运算符(operator),并将客户传递给运算符(operator))

出租车 ---观察所有--->运营商(需要以某种方式在这里推送数据,如果出租车被占用,则无法接受新客户端)

出租车 ---通知---> 运算符(operator)(如果出租车可以接受客户,它会通知运算符(operator),我不关心任何竞争条件,因为此事件将手动触发.另外,也许出租车应该通知公司而不是运营商?)

我认为 TaxiFirm 可能不需要将客户传递给运营商,但想想现实生活,实际上是运营商与客户交谈......

我已经写下了我的思考过程,请帮助我找出这个模型的架构。

最佳答案

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

observer.notify(ClientInfo info)

当然,观察者也可以请求信息:

observer.notify()

void notify() {
update();
}

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

一个简单的建议,供您入门:

类运算符:

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.
}

出租车等级:

boolean notify(Operator operator, RideNumber rideNumber) {
if (isTaxiAlreadyCarryingPassenger()) return false;

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

return true;
}

注意:RideNumber 只是一个识别号,出租车稍后用它来向运营商请求客户信息。您可以改为通过notify方法发送clientInfo,但随后所有出租车都会获取此信息,这对安全性来说非常糟糕,并且也可能会造成困惑(发送不应使用的信息)。

<小时/>

更新:

如果这是一项家庭作业,并且您必须使用精确的 ObserverPattern,则可以执行以下操作:

类运算符:

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;
}

出租车等级:

void notify(Operator operator, RideNumber rideNumber) {
if (!isTaxiAlreadyCarryingPassenger()) {

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

关于java - 观察者模式: notify with state,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40851640/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com