我删除了以前的问题,因为它太复杂了。我正在创建一种多功能的数据驱动系统行为。因为我不能在需要的时候实时创建对象,所以我在程序开始时解析和存储它们。这些行为实际上是为它的所有者执行操作。
我可以复制这些行为并将所有者添加到其中。但我认为这是不必要的,这些行为可以作为模板。因此,每个具有相同行为的所有者都是指同一个对象。
当所有者经历事件时,行为可以激活。这就是行为具有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数据非常大,单个行为可以包含大量数据和数十个操作。会有“无止境”的行为数量,每个所有者都有可能拥有每一个行为。
发布于 2016-03-23 19:57:39
您需要维护多少数十亿个对象实例?
正如您已经说过需要存储所有者相关的数据一样,您可能不会期望得到更少的实例。
另一方面,实际代码已经由类实例共享,而不是对每个实例进行“复制”。因此,对象实例只使用它们的数据空间。
如果您用于设置各个实例和对象的XML配置在所有所有者中是“常量”的。您可以使用拆分实现。实例化所有者“已知”并使用相关XML初始化的对象,然后将该XML转发到一个工厂类,该工厂类维护类的XML代码特定实例,然后将该类用作本地实例,并在获取传入数据以供处理的“相同”行为的所有实例之间共享。当然,这些行为实例需要作为不可改变的对象来实现,以允许适当的共享。
发布于 2016-03-23 19:56:01
使用不可变的策略对象,这样您就可以共享它们。
https://stackoverflow.com/questions/36187266
复制相似问题