📄 请教另一个模式问题.txt
字号:
public static StandardData parseFromFile(YourFileClass file)
{
... ...
}
public static StandardData parseFromDB(YourDBPersistantObject db)
{
... ...
}
... ...
}
01/10/14 19:24 酷帖! 臭帖! 回复
酷帖评价: 臭帖评价:
返回页首
developerlin 举例说明... ...
--------------------------------------------------------------------------------
DataStandard data = DataStandardParser.parseFromFile(file);
DataSource source = new DataSource(data);
//假设你的画图程序叫做GUI
GUI.setDataSource(source);
01/10/14 19:29 酷帖! 臭帖! 回复
酷帖评价: 臭帖评价:
返回页首
developerlin 补充一点。如果你的程序架设在多视图的假设上,那么上面的说法需要做一些改动
--------------------------------------------------------------------------------
1。给你的视图定义一个interface,内含一个方法
public interface TView
{
// 重画视图
public void refresh();
}
2。给你的数据源定义一个interface
public interface TProvider
{
public void notify();
public StandardData toStandardData();
}
这个方法并不一定好,如果你已经有许多现存的数据源,要改动这些数据源的代码会很麻烦,代价太大。在这种情况下,我想最好这样,将TProvider作为Adapter使用,然后设计多个实现(concrete object),每个实现对应一类已经存在的数据源,说白了就是给数据源包一个外套。你的新系统不再直接调用原有的数据源,而是调用具备同样功能的数据源的外套——TProvider的实现。
3。设计一个DataSource
public class DataSource
{
//DataSource、TView可以接收的数据格式
private StandardData data;
//数据源
private TProvider provider;
//视图列表
private Vector viewList = new Vector();
public DataSource(TProvider provider)
{
setProvider(provider);
}
public void setProvider(TProvider provider)
{
... ...
}
public void addView(TView view)
{
viewList.addElement(view);
}
private void reloadData()
{
//重新装载TProvider提供的数据
}
}
在DataSource中维护一个对应表,维护数据源和视图的一对多关系。
下面结合例子说明一下:
TProvider provider = new ConcreteProvider();
TView theView = new ConcreteView();
DataSource source = new DataSource(provider);
source.addView(theView);
/**
* source.addView(theView)也可以设计成 theView.setDataSource(source);
*/
那么我们来看看,当ConcreteProvider中的状态发生变化时发生了什么事:
1.provider.update();
2.update调用provider.notify();
notify方法将调用source.reloadData();
3.source.reloadData();调用TProvider中的toStandardData()更新私有变量
data.toStandardData方法将数据源中的数据转化成视图能够接受的数据。
之后,source遍历viewList中每个TView,调用TView的refresh()通知视图更新。
01/10/14 21:47 酷帖! 臭帖! 回复
酷帖评价: 臭帖评价:
返回页首
fqnewman 未免太教条了一点,你只要找到一种合身的解决方案管它是什么模式,模式并非定律也只是前人经验的积累,你也可以写设计模式
--------------------------------------------------------------------------------
01/10/14 22:58 酷帖! 臭帖! 回复
酷帖评价: 臭帖评价:
返回页首
slovenboy 是这样,只是小弟的水平不高,还写不了模式,只能研究前人的经验。
--------------------------------------------------------------------------------
01/10/15 10:01 酷帖! 臭帖! 回复
酷帖评价: 臭帖评价:
返回页首
lianghaiying1 设计模式很少能只使一个
--------------------------------------------------------------------------------
几乎每次从想用某一模式开始,到连用几个模式结束,
虽说解决不少问题,但我怎么有一种上了贼船的感觉。
01/10/15 10:13 酷帖! 臭帖! 回复
酷帖评价: 臭帖评价:
返回页首
jdev 完整解决方案
--------------------------------------------------------------------------------
如果只是就图和数据源而言,好象什么模式都没有.
我想问题可以这样解决:
1. 定义一个数据类,例如: GraphData
GraphData中保存图中的具体数据,GraphData和数据源是独立的.
2. 定义产生GraphData的Interface,例如:DataParser
interface DataParser {
GraphData getData(Properties prop);
}
其中: getData(Properties prop);的目的是通过传递特定的属性,
得到相应的GraphData.
注意这是一个interface,也就是说,对不同的数据源,有不同的实例.
如: DBDataParser, XMLDataParser, CSVDataParser等等.
3. 在图的显示过程中,针对具体的数据源,引用响应的实例,调用
getData(Properties prop);来获取响应的数据.
这个问题其实比较普遍,对不同的系统要求,可能会有不同的扩展.
>> 人机交互
如果图中要求对用户的操作作出反应,采用Listener;
如果要求图中的数据对其它系统的操作作出反应,采用Observer模式,
但是可能要更改DataParser的定义,如叫:DataObserver.
>> 针对小型系统
采用Farcade模式,定义一个DataManager,将类似图中获取数据的功能
综合起来, 如:
public class DataManager {
...
public static GraphData getData(
String aliasOfDataParser,
Properties prop) throws Exception;
...
}
其中: aliasOfDataParser是一个用来判定数据源的一个字符串
假定这是一个单独运行的系统,而且要求能允许用户化,那么,具体数据
源的确定是通过初始化文件来确定的, 如: config.ini
在初始化文件中,对系统中被引用的数据源的定义可以采用如下的方式:
...
XMLDataParser
... // whatever
...
DBDataParser
...
...
...
这样,在系统初始化时,系统读入初始化文件,所有的数据源也被得以初始化.
>> 针对大型系统
对大型系统,可能有不同的侧重,也就有不同的解决方案,
如:对性能要求很高,那么,可以考虑在实际到数据源获取数据和图中获取数据
之间,加入一层Cache,或采用多现程MultiThreading等.
// jdev
01/10/15 11:58 酷帖! 臭帖! 回复
酷帖评价: 臭帖评价:
返回页首
slovenboy 太酷了, 还有个疑问, 如何处理这样的问题? 【送花一朵】
--------------------------------------------------------------------------------
我在用Observer 时,
DataObserver 中需要定义些公用的方法,
但java的interface中方法是不能有代码的。
这样在实现DataObserver时每个实现中都要
写重复的代码???
不知如何解决?请赐教。。
很感谢你的完整方案!
01/10/15 21:28 酷帖! 臭帖! 回复
酷帖评价: 臭帖评价:
返回页首
slovenboy 同感,诶,,
--------------------------------------------------------------------------------
越用越累,明知是贼船也得上阿!
不用会更累。
01/10/15 21:38 酷帖! 臭帖! 回复
酷帖评价: 臭帖评价:
返回页首
jdev 回复: 太酷了, 还有个疑问, 如何处理这样的问题? 【送花一朵】
--------------------------------------------------------------------------------
将DataObserver定义为class,其中将所有数据源共用的功能(如:数据的转换)以具体的代码实现,而将针对不同数据源的获取数据的功能定义为virtual.如:
class DataObserver implements Observer {
public GraphData transform(OriginData data) {
...
}
// data retrieving functions
public virtual OrigData getData(Properties prop);
}
如此就可以解决你提出的问题.
// jdev
01/10/16 10:07 酷帖! 臭帖! 回复
酷帖评价: 臭帖评价:
返回页首
slovenboy 明白了, virtual 怎么理解?
--------------------------------------------------------------------------------
这是C++代码吗??
如果用java ,好想没有这种结构?
01/10/16 11:16 酷帖! 臭帖! 回复
酷帖评价: 臭帖评价:
返回页首
jdev 回复: 明白了, virtual 怎么理解?
--------------------------------------------------------------------------------
OOPS,这几天C++老是和JAVA打架,搞混了,修改如下:
abstract class DataObserver implements Observer {
public GraphData transform(OriginData data) {
...
}
// data retrieving functions
public abstract OrigData getData(Properties prop);
}
// jdev
01/10/16 13:00 酷帖! 臭帖! 回复
酷帖评价: 臭帖评价:
返回页首
lianghaiying1 回复: 同感,诶,,
--------------------------------------------------------------------------------
可几乎所有的设计模式都有多多少少的副作用,
使得多了心里没底,不知道副作用是否控制的住
01/10/16 13:03 酷帖! 臭帖! 回复
酷帖评价: 臭帖评价:
返回页首
slovenboy Thanks.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -