【发布时间】:2016-03-23 19:39:50
【问题描述】:
我已经删除了我之前的问题,因为它太复杂了。我正在创建一个通用的数据驱动系统行为。因为我无法在需要时实时创建对象,所以我在程序开始时解析并存储它们。这些行为实际上是为其所有者执行操作。
我可以复制行为并将所有者添加到它们。但我认为这是不必要的,行为可以作为模板。所以每个拥有相同行为的所有者都指的是同一个对象。
当所有者遇到事件时,可以激活行为。这就是行为具有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 数据非常大,一个行为可以包含大量数据和数十个操作。会有“无穷无尽”的行为,每个所有者都可能拥有每一个。
【问题讨论】:
标签: java xml pass-by-reference deep-copy data-driven