0

前の質問が複雑すぎたので削除しました。汎用性の高いデータ駆動型システムの動作を作成しています。必要なときにリアルタイムでオブジェクトを作成できないため、プログラムの開始時にすべてを解析して保存します。これらの動作は、実際に所有者のアクションを実行します。

動作をコピーして、所有者を追加することができました。しかし、これは不要であり、動作はテンプレートとして機能すると思います。したがって、同じ動作をする各所有者は同じオブジェクトを参照しています。

所有者がイベントを経験すると、動作がアクティブになります。そのため、動作には が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 つの動作に大量のデータと何十ものアクションが含まれる場合があります。「無限」の量の動作があり、各所有者は潜在的にそれぞれを所有できます。

4

2 に答える 2

0

不変の Strategy オブジェクトを使用して、それらを共有できるようにします。

于 2016-03-23T19:56:01.437 に答える