Java:当模型';s集合是否添加到?
所以我正在为一位教授重写一个程序,我有一些关于模型-视图-控制器模式的问题。该程序称为GraphViewer,用于设计和查看图形(如图论,而非统计)。到目前为止,我对结构进行了如下规划:Java:当模型';s集合是否添加到?,java,model-view-controller,collections,properties,Java,Model View Controller,Collections,Properties,所以我正在为一位教授重写一个程序,我有一些关于模型-视图-控制器模式的问题。该程序称为GraphViewer,用于设计和查看图形(如图论,而非统计)。到目前为止,我对结构进行了如下规划: 模型 VertexModel-具有id、位置、颜色以及与其重合的边集合 EdgeModel-有它跨越的两个顶点,权重、颜色和其他一些东西 GraphModel-主要但不仅仅是顶点集合和边集合 观点 顶点视图-绘制其顶点,并具有自己的属性 EdgeView-绘制其边缘,并具有自己的一些特性 GraphVi
- 模型
- VertexModel-具有id、位置、颜色以及与其重合的边集合
- EdgeModel-有它跨越的两个顶点,权重、颜色和其他一些东西
- GraphModel-主要但不仅仅是顶点集合和边集合
- 观点
- 顶点视图-绘制其顶点,并具有自己的属性
- EdgeView-绘制其边缘,并具有自己的一些特性
- GraphView-基本上是一个JPanel,它有一个顶点和边视图的集合,当它得到一个绘制命令时,它还会遍历每个视图集合并向它们发出绘制命令
- 控制器
- GraphController-负责解释用户添加顶点、边等的手势,并更新模型
非常感谢,正如你所知道的,我对设计模式有点陌生 不要公开模型的私有集合成员,因此不允许调用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