我删除了之前的问题,因为它太复杂了。我正在创建一个多功能的数据驱动系统行为。由于我无法在需要时实时创建对象,因此我会在程序开始时解析并存储所有对象。这些行为实际上是为其所有者执行操作。
我可以复制行为并将所有者添加到他们身上。但我认为这是不必要的,行为可以作为模板。因此,具有相同行为的每个所有者都指的是同一个对象。
当所有者体验事件时,可以激活行为。这就是行为具有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数据非常大,单个行为可以包含大量数据和许多操作。会有无尽的&#34;行为量和每个所有者可能拥有每个行为。
答案 0 :(得分:0)
使用不可变的策略对象,以便共享它们。
答案 1 :(得分:0)
您需要维护多少数十亿个对象实例?
正如您已经声明的那样,您需要存储所有者相关数据, 你可能不会期望得到更少的实例。
另一方面,实际代码已经由类实例保持共享,并且不会被复制&#34;对于每个实例。因此,对象实例仅使用其数据空间。如果您用于设置各个实例的XML配置是&#34;常量&#34;在所有业主中。您可以使用拆分实现。实例化一个已知的对象#34;由所有者进行初始化并使用相关的XML进行初始化,然后将该XML转发到工厂类,该工厂类维护一个类的特定于XML代码的实例,然后将其用作本地实例并在所有&#34;相同&#34的实例之间共享;获取传入数据进行处理的行为。当然,这些行为实例需要作为不可变对象来实现,以便进行适当的共享。