大家帮忙看看这个问题:是否适应了设计的要求

yoyoxo 2003-03-05 02:04:09
描述:一个常见的功能模块,要实现对一个业务对象的属性进行修改和保存。展现一个参数配置界面,它先连接到服务器端取得各项参数,显示。客户进行修改后,可以保存到数据库。
要点一、配置参数存在于服务器端一个xml文件,它的节点和层次关系在将来可能经常变动。这就要求配置界面作响应的变动。设计要求系统能够方便地应对这一变化。
要点二、目前从服务器取得数据的方式非常低效,将来可能换成其他获取方式。设计要求系统尽量将对数据进行获取、解析的过程和界面分离开。

于是想按照MVC的思路进行设计。设想如下:
一个View类,是配置参数的界面,
一个DataManager类,负责连接服务器,获取数据,解析数据的格式,保存数据等
一个Model类,将View要用的各种参数组合成一个对象类,提供一系列set,get方法获取和设置这些参数。

现在问题是怎样建立这三者之间的联系,而不使它们耦合得太紧。
基于这个设想,有下面的做法。不知道好不好?

/////////////////////////////////////////////////////////////////
class View{
DataManager dm;
Mode model;

//用于建立View和DataManager之间的联系
public void setDataManager(DataManager dm){
this.dm=dm;
}

//用于建立View和Model之间的联系
public void setModel(Model model){
this.model=model;
}

//对界面控件的事件处理!!!!!!!!!!!!!!!!!!
//界面某个控件的值改变了,立即更新到Model
component1.addXXXListener(new XXXListener(){
..............
model.setXXX(aaa);
..............
});
//每个控件都如此事件处理


//保存界面参数的处理
saveComponent.addXXXListener(
..............
dm.save();
..............
);

//重新取得数据
reloadComponent.addXXXListener(
.......
dm.load();
.......
);

}


/////////////////////////////////////////////////////////////////
interface Interface1{
public Object getSaveData();
}

class Model implement Interface1{
Object obj1;
Object obj2;
.....

//一定要实现这个方法,DataManager从这里取得要保存的数据
public Object getSaveData(){
//将各个成员变量按存储格式的要求组合起来
//...
return....
}

//下面是一系列set,get方法

}


/////////////////////////////////////////////////////////////////
interface Interface2{
public void load();
public void save();
...
}

class DataManager implements Interface2{
View view;
Model model;

public DataManager(View view,Model model){
this.view=view;
this,mode=model;
}

public void load(){
//连接服务器,取得数据
//一方面,根据取得的数据设置View界面的显示状态
view.component1.setXXX;
.......
//设置view的各个控件的当前值
view.component1.setValue(aaa);
view.component2.setValue(bbb);
//另一方面,根据取得的数据初始化Model
model.setXXX(aaa);
model.setYYY(bbb);
....
}

public void save(){
//从model取得数据,保存
Object values=model.getSaveData();
saveToDB();
//连接服务器,保存数据。
}

}


////////主类

class MainClass(
.........
...........{
View view=new View();
Model model=new Model();
DataManager dm=new DataManger(view,model);
view.setDataManager(dm);
view.setModel(model);
dm.load();
.....
}
}

对于上面的设计,大家说怎么样?感觉View和DataManager耦合很紧。
View中有DataManager,DataManager中有View。有点你中有我,我中有你的味道。
不知道这样做能不能达到要点一、二的要求?大家能否给改一改,谢谢!
...全文
16 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
zmrljl 2003-03-07
  • 打赏
  • 举报
回复
我的想法:
首先做一个对象管理类(包括add------提供list列表记录对象的name-value ,remove---提供list列表记录对象的name-value ,get,set total()方法)
解吸xml文件类:(add---提供list列表记录对象的name-value ,remove--提供list列表记录对象的name-value ,get,set total() )
两个类同时继承一个controll抽象类(total()--用于计算两个列表中对象的数目,return不相同的name-value对)--------调用相应的类的add()方法,对少对象的类进行添加!
bluesmile979 2003-03-06
  • 打赏
  • 举报
回复
model采用composite模式应该户解决很大问题吧?

yoyoxo 2003-03-06
  • 打赏
  • 举报
回复
还是回到问题:
比如:xml文件中增加了一个节点,则界面上就应该相应增加一个对该节点配置的控件(或界面)等,同时load数据的那部分也要load这个新的节点,model中也要增加一个对应该节点的域,
保存数据的时候也要考虑进这个节点。
删除了一个节点也同样如此。如果改变了节点之间的层次关系,改动可能更大。
现在无法预料到这种改变。改动可能无法避免,但能不能将这种改变控制到很小的范围?
zmrljl 2003-03-06
  • 打赏
  • 举报
回复
参数的配置界面有必要是动态的吗?我们只需要有那些参数被选中不就可以了吗?请明示
bluesmile979 2003-03-06
  • 打赏
  • 举报
回复
to:飞猫,网站不错,不过内容还比较少,加油啊。期待中…………
yoyoxo 2003-03-06
  • 打赏
  • 举报
回复
to freebase:
这里是一对一的关系
以后可能向b/s发展
freejacky 2003-03-05
  • 打赏
  • 举报
回复
GZ
freebase 2003-03-05
  • 打赏
  • 举报
回复
还有,比如你的这个系统,以后是不是要向B/S 或者说是 Jsp+Bean+Ejb的形式发展,这个时候,控制类是什么?视图类如何驱动数据类?

访问我的网站 www.oodiscovery.com
freebase 2003-03-05
  • 打赏
  • 举报
回复
设计模式不是一切,我们应该回到问题的本原:
我们通过一定的方式把数据和数据表示进行分离,让同样的数据具有不同的表现形式,也让不同的数据体现出相同的形式;
首先我们要分析的是
数据和他的表现形式是什么样的关系?
一对多?多对一?多对多?
具体地说就是一组数据和一个界面的关系
有时候一个界面要表现好几组数据,有的时候好几个界面同时表现同一组数据。

接下来看看数据的表现者和修改者是什么关系,在这个问题中如果你不是在使用EJB的话,要考虑对于数据类对于数据库的访问和更新形式是主动的,还是被动的(由其他的组件来驱动,比如定时器)

下面的问题就是考虑修改者之间和修改者、表现者之间出现的对数据的资源争用问题,和数据同步问题。

由于不太清楚你的需求,比如,究竟有多少个表示层实体在使用数据类?系统对数据存储的要求和整体设计数据的组织,所以不太容易下详细的断言。

以上只供参考,提供一个思路。

访问我的网站 www.oodiscovery.com
yoyoxo 2003-03-05
  • 打赏
  • 举报
回复
我这里的DataManager实际上应该就是一个Controller,这里该换一个名称。
如果这里使用Observer模式,好不好?
v里的某个控件改变了:比如在一个下拉框中选择了另一项或文本框中写如其他内容。
它是直接通知model,还是通过c转发?
如果是前者,view通过向model注册后,就可以收到model改变的通知。而view发送消息怎么让model更新自己?
如果是后者,view怎样通知c?view是不是要看见c,c再通知m,c是不是要看见m?
我对Observer的理解仅停留在口头上,还没用过,呵呵,
能否就上面的框架代码按照你的意思修改一下。我是越说越胡涂了,呵呵....
bluesmile979 2003-03-05
  • 打赏
  • 举报
回复
DataManager可以作为c的一个属性(好像你不打算加个c,只打算用datamanager来做c:))

而如果变化由m通知的话,c里面是不是就不用v了?

这样启动的顺序m-c-v是否可以?(m总应该是在v之前吧?)

每隔一个时间间隔从服务器端重新取一次数据。动作当然由c来产生

另外,对observer模式,一般是model改变,更新view,这里同时要做到view改变,更新model,这样互操作会不会有问题? 这里更新v是由m说了算,当然可以做到m更新完后才通知v要更新了。




yoyoxo 2003-03-05
  • 打赏
  • 举报
回复
呵呵。bluesmile979,谢谢!
你的意思是要用一个observer模式吧。说到这里,提醒了我一个问题。如果要实现每隔一个时间间隔从服务器端重新取一次数据。是不是要如上所说的:
DataManager主动发起连接,取出的数据交给m,由m通知v状态有变化,从而更新视图。
这样在MainClass中,DataManager的实例应该是主导的。是否应该在view,model实例化值前就存在。而在上面的MainClass中是先实例化一个view,一个model,再才产生一个以两者为参数的DataManager实例,这互相之间的包含关系是不是有点乱?
DataManager以view和Model为参数实例化,这样的设计妥不妥?
另外,对observer模式,一般是model改变,更新view,这里同时要做到view改变,更新model,这样互操作会不会有问题?
请大家说说看。。。
bluesmile979 2003-03-05
  • 打赏
  • 举报
回复
我想c读取的数据应该是交给m,这个模型里面m才是用来存取数据的单位。你这里Datamanager也好像太大了,数据库的操作是不是可以再分出来?取出的数据交给m,由m通知v状态有变化,从而更新视图。你现在好像是c直接更新视图的,而m里面没有状态变化后通知v的方法。这样多个v的时候的更新呢?

你的第一个问题如果的实现处理得好的话应该是不会有太大问题的了

而数据库的操作也可以控制在Datamanager可以不影响c,用名词来说是不是可以使用策略模式把数据库的处理解决呢?这样就把问题的责任分给下面了。

一点愚见,希望和大家讨论。
lkenshin 2003-03-05
  • 打赏
  • 举报
回复
学习

up
yoyoxo 2003-03-05
  • 打赏
  • 举报
回复
是啊。大家怎么不讨论一点实际的问题?呵呵....
richardluopeng 2003-03-05
  • 打赏
  • 举报
回复
呵呵,怎么没有人说,呵呵

51,396

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧