私は以前の質問をあまりにも複雑なので削除しました。私は多目的なデータ駆動型のシステム動作を作成しています。私が必要なときにはいつでもリアルタイムでオブジェクトを作成することができないので、プログラムの始めにすべてを解析して保存します。これらの動作は、実際にその所有者のためのアクションを実行します。コピーするかコピーしないかを指定してください
私は行動をコピーし、それらに所有者を追加することができます。しかし、私はこれが不要であり、その振る舞いがテンプレートとして機能できると思います。したがって、同じ動作をする各所有者は同じオブジェクトを参照しています。
動作は、所有者がイベントを経験するとアクティブになります。そのため、動作にはOwnerListener
があり、動作がイベントと互換性がある場合は、動作を実行します。
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();
}
}
}
は今、私はこれらの行動の多くを持っているので、そのうちのいくつかは、巨大な(行動の多くの数十)することができます。私は本当に各所有者のためのコピーを持つように感じていない。
ボトルネックは、アクションが実行時に特定のデータにアクセスする必要があるため、追加のデータフィールドです。また、所有者にアクセスする必要もありますが、各リスナーメソッドのデータフィールドによって提供することもできます。
この質問はまだ長く続きました。私はそれが今より明らかであることを願っています。私は本当に各所有者のためにそれぞれの行動をコピーする必要がありますか、それとも他の方法がありますか?私のXMLデータはかなり大きいですが、1つのビヘイビアで多くのデータとたくさんのアクションが発生する可能性があります。 「無限」の行動量があり、各所有者はそれぞれの行動を所有する可能性があります。