gpt4 book ai didi

java - 当观察者需要不同的参数更新时,观察者设计模式中该怎么做

转载 作者:行者123 更新时间:2023-11-29 07:25:07 24 4
gpt4 key购买 nike

考虑一家制造 spaceship 的 spaceship 工厂。当它生产一艘飞船时,它会更新它所居住的星球上的当前资源,并更新飞船存储的状态。因此, spaceship 工厂是两个观察者的发布者。即星球上的资源和飞船储存。 .使用观察者设计模式时,观察者必须实现更新方法,只要发布者想要发布,发布者就可以调用该方法。发布者将其观察者列表存储在 Arraylist 中,并通过遍历每个观察者来调用更新,如下所示:

public class SpaceShipFactory implements Publisher{

private ArrayList<Observer> observers;
private int mmRequired;
private int eRequired;
private int cRequired;
private int dRequired;
private int vRequired;

public void notifyObservers() {
for(Observer obs : observers)
obs.update(this.mmRequired, this.eRequired, this.cRequired , this.dRequired, this.vRequired );
}
}

问题是,我们要更新的星球资源存储和宇宙飞船存储是不同的。即一个减少资源数量,一个增加飞船数量。因此他们的更新方法可能有不同的签名。所以我们不能对两个观察者使用相同的更新方法。因此我们需要一个一个的调用update,伪代码如下:

public void notifyObservers() { 
for(Observer obs : observers)
if(obs.equals(PlanetResourceStorage)
obs.update(this.mmRequired, this.eRequired, this.cRequired , this.dRequired, this.vRequired );
else if (obs.equals(SpaceShipStorage)
obs.update(numberOfManifacturedLightFight, numberOfManifacturedHeavyFighter, numberOfFacturedStarDestoyer,NumberOfFacturedBattleShips,NumberofFacturedDeathStars)

}
}

我想知道我们是否应该这样做?也许我们应该创建一个更新方法,其中包含发布者想要发布的所有可能值的参数,并且观察者可以使用所有这些值,即使他们不需要知道更新方法的所有参数。例如:

public class SpaceShipFactory implements Publisher{

private ArrayList<Observer> observers;
private int metalRequired;
private int energyRequired;
private int carbonRequired;
private int deuteriumRequired;
private int vibraumRequired;
private int numberOfStarDestoyerBuilt;

public void notifyObservers() {
for(Observer obs : observers)
obs.update(this.metalRequired, this.energyRequired, this.carbonRequired , this.deuteriumRequired, this.vibriumRequired, this.numberOfStarDestoyerBuilt );
}
}

因此在行星资源更新的实际实现中,忽略了关于 build 船只数量的争论。我还发现输入给定更新方法的所有参数非常繁琐,我想知道是否有更简单的方法。

例如,行星资源的更新实现将是:

public class PlanetResources implements Observer {

//Amount of resources of each type
private int metallicMicrolattice;
private int energy;
private int carbyne;
private int deuterium;
private int vibranium;

// The factories to produce the Resources
private Publisher aMetallicMicrolatticeFactory;
private Publisher aSolarPlant;
private Publisher aCarbyneFactory;
private Publisher aHeavyWaterExtractor;
private Publisher aVibraniumMine;

// The Factory to produce mission units
private Publisher aShipFactory;

public void update(int mmAmount, int pEAmount, int pCAmount, int pDAmount,
int pVAmount, int numberOfManifacturedLightFight, int numberOfManifacturedHeavyFighter, int numberOfFacturedStarDestoyer,int numberOfFacturedBattleShips,int numberofFacturedDeathStars) {
this.metallicMicrolattice = this.metallicMicrolattice + mmAmount;
this.setCarbyne(this.getCarbyne()+pCAmount);
this.deuterium = this.deuterium + pDAmount;
this.energy = this.getEnergy() + pEAmount;
this.vibranium = this.vibranium + pVAmount;

// TODO Auto-generated method stub

}
}

飞船存储的更新方法是:

public class StationedShip implements Observer
{
private ArrayList<SpaceShip> lightFighters;
private ArrayList<SpaceShip> heavyFighters;
private ArrayList<SpaceShip> cruisers;
private ArrayList<SpaceShip> battleShips;
private ArrayList<SpaceShip> bombers;
private ArrayList<SpaceShip> battleCuisers;
private ArrayList<SpaceShip> starDestoyers;
private ArrayList<SpaceShip> superStarDestoyers;
private ArrayList<SpaceShip> deathStars;
private ArrayList<SpaceShip> espoinageProbes;
private ArrayList<SpaceShip> IonShooters;

private ArrayList<SpaceShip> smallTransforters;
private ArrayList<SpaceShip> largeTransporters;
private ArrayList<SpaceShip> recyclers;
private ArrayList<SpaceShip> colonialShips;
@Override
public void update(int planetMetallicMicrolattice, int planetEnergy, int planetCarbyne, int planetDeuterium,
int planetVibranium,numberOfManifacturedLightFight, int numberOfManifacturedHeavyFighter, int numberOfFacturedStarDestoyer,int numberOfFacturedBattleShips,int numberofFacturedDeathStars) {
//code to add ships to the arraylist of ships

}

}

最佳答案

看来您可能错过了观察者模式的要点。这个想法应该是当一个事件发生时,任何关心它的人都可以得到该事件的通知。你得到了那个部分。但该模式还应该使可观察者不必知道除了通知谁以外的任何事情,因此可观察者不需要知道观察者将如何处理事件。那是你缺少的部分。

那是什么意思呢?这意味着当 spaceship 完成时,任何关心此事件的人都会收到通知。通知中发送的数据只是已完成船舶的句柄。

鉴于船舶,船舶存储需要查找它关心的细节。也许是大小、质量等。

鉴于这艘船,行星 Assets 负债表需要查找 build 该船所用的资源(可能通过查找设计和相关 Material list )。

发布的事件(消息)不需要包含任何观察者可能想知道的所有内容 - 它应该只包含可能发生的事情的最具体指标。这意味着您不会说生产了哪种船(例如,“宪法级”),而是说生产了具体的船(例如,“NCC-1701”)。然后,您的数据库(或数据结构)必须允许观察员乘坐特定船只(例如“NCC-1701”)并将其链接到他们处理事件所需的任何信息。

关于java - 当观察者需要不同的参数更新时,观察者设计模式中该怎么做,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54768147/

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