Java:具有类型化细胞的元胞自动机



我正在研究一种基于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-Visitor模式来解决滥用实例的文章,但我似乎不知道如何将其应用于这个问题。思考如何做到这一点,或者其他解决问题的方法?

谢谢!Steve

我到处玩,不知道如何使访问者模式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);
        }   
    }   
}   

附言:在循环中为State赋值时,您的意思是使用|=吗?

相关内容

  • 没有找到相关文章

最新更新