Ich habe meine vorherige Frage gelöscht, da es zu kompliziert war. Ich erstelle ein vielseitiges datengesteuertes Systemverhalten. Da ich keine Objekte in Echtzeit erstellen kann, wann immer ich sie brauche, parse ich sie und speichere sie alle am Anfang meines Programms. Diese Verhaltensweisen führen die Aktionen für den Besitzer tatsächlich aus.Um zu kopieren oder nicht zu kopieren
Ich könnte die Verhaltensweisen kopieren und den Besitzer zu ihnen hinzufügen. Aber ich denke, das ist unnötig und die Verhaltensweisen können als Vorlagen funktionieren. Also bezieht sich jeder Besitzer mit demselben Verhalten auf dasselbe Objekt.
Ein Verhalten kann aktiviert werden, wenn der Besitzer ein Ereignis erlebt. Deshalb hat das Verhalten eine OwnerListener
und wenn das Verhalten mit dem Ereignis kompatibel ist, wird es seine Aktionen ausführen.
public class Behavior implements OwnerListener {
List<Action> actions = new ArrayList<>();
HashMap<String, Object> additionalData = new HashMap<>();
public Behavior(XmlElement behaviorNode)
{
//Parse XML
}
@Override
public void seeSomeone(Object someone) {
//Since I need to run the actual greet action that was created by XML I need to store the person to greet.
additionalData.put("PERSON_SEEN", someone);
for (Action action : actions)
{
//if action is compatible with seeing someone action.perform();
//if that action actually needs the person it can take it from this behavior template additionalData.get("PERSON_SEEN");
}
}
@Override
public void getTalkedTo(Object talker) {
additionalData.put("BEING_TALKED_TO", talker);
for (Action action : actions)
{
//if action is compatible with being talked to action.perform();
}
}
}
Jetzt, da ich habe viele dieser Verhaltensweisen und einige von ihnen können sehr groß (viele Dutzende von Aktionen) sein. Ich habe wirklich keine Lust, für jeden Besitzer eine Kopie zu haben.
Der Engpass ist das zusätzliche Datenfeld, da die Aktionen zum Zeitpunkt der Ausführung Zugriff auf bestimmte Daten benötigen. Sie benötigen auch Zugriff auf den Besitzer, aber dieser kann auch von diesem Datenfeld in jeder Listener-Methode bereitgestellt werden.
Diese Frage wurde immer noch viel länger als ich wollte. Ich hoffe, es ist jetzt klarer. Muss ich wirklich jedes Verhalten für jeden Besitzer kopieren oder gibt es andere Möglichkeiten? Meine XML-Daten sind ziemlich groß, ein einzelnes Verhalten kann viele Daten und viele Dutzend Aktionen enthalten. Es wird "endlos" viele Verhaltensweisen geben und jeder Besitzer kann potenziell jeden besitzen.