⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 请教另一个模式问题.txt

📁 一些关于UML的经典讨论
💻 TXT
📖 第 1 页 / 共 2 页
字号:
  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 + -