Java:带有键入单元格的细胞自动机

时间:2014-09-27 03:24:17

标签: java polymorphism cellular-automata

我正在研究基于Java的类似细胞自动机的实现(在技术上不确定,如下所示),其中各个单元可能具有封装不同数据和CA规则的不同类型。可能有很多类型,我希望能够动态插入新的类型,而无需维护其他代码。

所有细胞类型都来自共同的基类。每个单元格的update()方法在模拟的每一帧中只调用一次:

public abstract class Cell
{
    public abstract void update(Cell[] neighbors);
}

当CA规则仅需要有问题的单元格的数据时,这可以正常工作,例如:

public class CellTypeA extends Cell
{
    public int Data = 0;

    @Override
    public void update(Cell[] neighbors)
    {
        Data++;
    }
}

但是,我有一些模拟规则要求单元格查询相邻的相邻单元格中的数据,但前提是它们是具有所述数据的类型。很有诱惑力使用instanceof运算符来实现这一目标:

public class CellTypeB extends Cell
{
    public boolean State = false;

    private void update(Cell[] neighbors)
    {
        for (Cell c : neighbors)
        {
            if (c instanceof CellTypeA)
            {
                State = (((CellTypeA)c).getData() > 10);
            }
        } 
    }
}

如果可能的话,我更愿意避免臭臭的情况。我也不能将getData()提升到超类来实现多态,因为这些单元格的实际数据结构会稍微复杂多变。我一直在阅读有关GoF访客模式以解决滥用行为的问题,但我似乎无法弄清楚如何将其应用于此问题。关于如何做到这一点的想法,或其他方法来解决问题?

谢谢! 史蒂夫

1 个答案:

答案 0 :(得分:2)

我玩过,无法弄清楚你如何制作访客模式a)整齐地处理两个要访问的项目和b)像你所要求的那样可插拔。

这样可行,但可能隐藏了番石榴内的instanceof内容:

import com.google.common.collect.Iterables;
import java.util.Arrays;

public class CellTypeB extends Cell
{
    public boolean State = false;

    @Override
    public void update(Cell[] neighbors) {
        Iterable<CellTypeA> onlyAs = Iterables.filter(Arrays.asList(neighbors), CellTypeA.class);
        for(CellTypeA a: onlyAs) {
            State = (a.getData() > 10);
        }   
    }   
}   

P.S。在循环中为|=分配值时,您的意思是使用State吗?