前の質問が複雑すぎたので削除しました。汎用性の高いデータ駆動型システムの動作を作成しています。必要なときにリアルタイムでオブジェクトを作成できないため、プログラムの開始時にすべてを解析して保存します。これらの動作は、実際に所有者のアクションを実行します。
動作をコピーして、所有者を追加することができました。しかし、これは不要であり、動作はテンプレートとして機能すると思います。したがって、同じ動作をする各所有者は同じオブジェクトを参照しています。
所有者がイベントを経験すると、動作がアクティブになります。そのため、動作には が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 つの動作に大量のデータと何十ものアクションが含まれる場合があります。「無限」の量の動作があり、各所有者は潜在的にそれぞれを所有できます。