Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:当模型';s集合是否添加到?_Java_Model View Controller_Collections_Properties - Fatal编程技术网

Java:当模型';s集合是否添加到?

Java:当模型';s集合是否添加到?,java,model-view-controller,collections,properties,Java,Model View Controller,Collections,Properties,所以我正在为一位教授重写一个程序,我有一些关于模型-视图-控制器模式的问题。该程序称为GraphViewer,用于设计和查看图形(如图论,而非统计)。到目前为止,我对结构进行了如下规划: 模型 VertexModel-具有id、位置、颜色以及与其重合的边集合 EdgeModel-有它跨越的两个顶点,权重、颜色和其他一些东西 GraphModel-主要但不仅仅是顶点集合和边集合 观点 顶点视图-绘制其顶点,并具有自己的属性 EdgeView-绘制其边缘,并具有自己的一些特性 GraphVi

所以我正在为一位教授重写一个程序,我有一些关于模型-视图-控制器模式的问题。该程序称为GraphViewer,用于设计和查看图形(如图论,而非统计)。到目前为止,我对结构进行了如下规划:

  • 模型
    • VertexModel-具有id、位置、颜色以及与其重合的边集合
    • EdgeModel-有它跨越的两个顶点,权重、颜色和其他一些东西
    • GraphModel-主要但不仅仅是顶点集合和边集合
  • 观点
    • 顶点视图-绘制其顶点,并具有自己的属性
    • EdgeView-绘制其边缘,并具有自己的一些特性
    • GraphView-基本上是一个JPanel,它有一个顶点和边视图的集合,当它得到一个绘制命令时,它还会遍历每个视图集合并向它们发出绘制命令
  • 控制器
    • GraphController-负责解释用户添加顶点、边等的手势,并更新模型
现在我的第一个问题与这个计划有关:每个模型都应该有一个视图吗?即使只有graphmodel是JComponent?现在我的一部分回答是肯定的——因为每个顶点和边的绘制可能不同。但我的另一部分对graphview的并行列表结构叫绝,它拥有与graphview的graphmodel集合中的模型相对应的视图集合(这太复杂了)。不知怎的,如果顶点或边模型发生变化,整个graphview必须重新绘制。我想这个问题的答案也与每个模型是否都有控制器有关。(我只是走错路了吗?)

与第一个问题的答案有点关联的是我的第二个问题:如果将顶点模型添加到graphmodel的集合中,我如何知道通知graphview?如果设置了一个全新的集合,它将在进入setEdge()方法时通知视图。但是如果我必须编写getEdge().add(…)怎么办?现在需要通知graphview更新,但从未调用SetEdge


非常感谢,正如你所知道的,我对设计模式有点陌生

不要公开模型的私有集合成员,因此不允许调用getEdge().add(…)

相反,公开API以允许添加/删除边,然后可以使用观察者模式在模型更改时通知视图

简单地说,只处理边缘

public class EdgeModel extends AbstractCollection<Edge> implements Observable {
    private List<Edge> edges = new ArrayList<Edge>();
    @Override public Iterator<Edge> iterator() { return edges.iterator(); }
    @Override public int size() { return edges.size(); }
    @Override public boolean add(Edge edge) {
        if (edges.add(edge)) {
            this.notifyObservers();
            return true;
        }
        return false;
    }

    // other stuff for Observable
}

public class EdgeView implements Observer {
    public void setModel(EdgeModel model) {
        model.addObserver(this);
    }
    public void update(Observable o, Object arg) {
        // model o has changed... update something visual I guess
    }
}
公共类EdgeModel扩展了AbstractCollection实现可观察{
私有列表边=新的ArrayList();
@重写公共迭代器迭代器(){return edges.Iterator();}
@重写公共int size(){return edges.size();}
@替代公共布尔添加(边){
如果(边。添加(边)){
这个。notifyObservators();
返回true;
}
返回false;
}
//其他可以观察到的东西
}
公共类EdgeView实现了Observer{
公共void集合模型(EdgeModel模型){
addObserver模型(this);
}
公共无效更新(可观察o,对象arg){
//模型o已经改变了…我想是更新了一些可视的东西
}
}

不要公开模型的私有集合成员,因此不允许调用getEdge().add(…)

相反,公开API以允许添加/删除边,然后可以使用观察者模式在模型更改时通知视图

简单地说,只处理边缘

public class EdgeModel extends AbstractCollection<Edge> implements Observable {
    private List<Edge> edges = new ArrayList<Edge>();
    @Override public Iterator<Edge> iterator() { return edges.iterator(); }
    @Override public int size() { return edges.size(); }
    @Override public boolean add(Edge edge) {
        if (edges.add(edge)) {
            this.notifyObservers();
            return true;
        }
        return false;
    }

    // other stuff for Observable
}

public class EdgeView implements Observer {
    public void setModel(EdgeModel model) {
        model.addObserver(this);
    }
    public void update(Observable o, Object arg) {
        // model o has changed... update something visual I guess
    }
}
公共类EdgeModel扩展了AbstractCollection实现可观察{
私有列表边=新的ArrayList();
@重写公共迭代器迭代器(){return edges.Iterator();}
@重写公共int size(){return edges.size();}
@替代公共布尔添加(边){
如果(边。添加(边)){
这个。notifyObservators();
返回true;
}
返回false;
}
//其他可以观察到的东西
}
公共类EdgeView实现了Observer{
公共void集合模型(EdgeModel模型){
addObserver模型(this);
}
公共无效更新(可观察o,对象arg){
//模型o已经改变了…我想是更新了一些可视的东西
}
}
  • 仅当需要以不同方式显示特定模型时,才将视图附着到该模型。对我来说,视图应该相互独立,而视图的层次结构听起来是错误的。如果只在一个视图中显示模型,那么一个
    GraphView
    就足够了

  • 您可以为集合编写一个包装器,该包装器截获所有修改调用,以处理对其侦听器的必要修改。或者,您也可以将
    GraphModel
    实现为一个将整个图形模型封装在内部以实现相同效果的工具

  • 仅当需要以不同方式显示特定模型时,才将视图附着到该模型。对我来说,视图应该相互独立,而视图的层次结构听起来是错误的。如果只在一个视图中显示模型,那么一个
    GraphView
    就足够了

  • 您可以为集合编写一个包装器,该包装器截获所有修改调用,以处理对其侦听器的必要修改。或者,您也可以将
    GraphModel
    实现为一个将整个图形模型封装在内部以实现相同效果的工具

  • 首先,看一看(及其答案)。它讨论了类似的问题

    第二,这里有一些关于你的问题的想法

    • 我觉得你对MVC有点太武断了。如果一个视图(即:GraphView)满足您的需要,则不必引入每个实体的视图
    • 似乎您的第二个问题假设getEdge()ret