3

我正在研究一个基于 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);
            }
        } 
    }
}

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

谢谢!史蒂夫

4

1 回答 1

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);
        }   
    }   
}   

PS您的意思是在循环中|=分配值时使用吗?State

于 2014-09-27T06:55:03.507 回答