抄还是不抄

To copy or not to copy

我已经删除了我之前的问题,因为它太复杂了。我正在创建一个通用的数据驱动系统行为。因为我无法在需要时实时创建对象,所以我在程序开始时解析并存储它们。这些行为实际上是为它的所有者执行的操作。

我可以复制行为并将所有者添加到它们中。但我认为这是不必要的,行为可以作为模板。所以每个具有相同行为的所有者都指的是同一个对象。

当所有者经历事件时,行为可以激活。这就是行为具有 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 数据很大,一个行为可以有很多数据和几十个动作。将有 "endless" 种行为,每个所有者都可能拥有每一种行为。

使用不可变的 Strategy 对象,以便您可以共享它们。

您需要维护多少亿个对象实例?

如您所述,您需要存储与所有者相关的数据, 您可能不会期望得到更少的实例。

n 另一方面,实际代码已经由 class 实例共享,而不是每个实例 "copied"。因此,对象实例仅使用它们的数据 space.

如果您使用 XML 配置来设置单个实例,那么在所有所有者中都是 "constant"。您可以使用拆分实现。实例化一个由所有者 "known" 并使用相关 XML 初始化的对象,然后将 XML 转发给维护 XML 特定代码的工厂 class class 的实例然后用作本地实例,并在获取传入数据以进行处理的 "same" 行为的所有实例之间共享。当然,这些行为实例需要作为不可变对象来实现以允许适当共享。