使用何种模式,问题新描述?

上述问题没有描述地特别清楚。
我们的问题是:
我们需要读/写一个文件file,这个文件可能在本地,也可能在远程一台计算机上。抽象类CFileProcess是父类,有两个操作readFile()和writeFile(). 两个子类CLocalFileProcess和CRemoteFileProcess继承了父类CFileProcess. 如果使用设计模式,是选择Factory Method还是Strategy模式,为什么?
谢谢!

----------
myzhai

发表文章: 1
注册时间: 2004-02


使用那种模式? 发表时间: 2004年02月28日 16:31:45 回复

有个问题请教。
在我们开发的系统中有一个这样的需求:
系统运行中客户需要写本地文件或者另一台计算机的远程文件,也可以一部分数据写入本地文件,另一部分数据写入远程文件。我们设计了两个类:LocalWrite和RemoteWrite来完成这个任务。用户写本地文件实例化类LocalWrite,写远程文件实例化类RemoteWrite,或者同时实例化这两个类。
现在我们希望利用模式设计的思想来重新设计我们的方案,为了满足上述要求,我们该采用哪个模式呢?是strategy还是Factory Method?这两个模式有什么区别?希望赐教。

bruce

发表文章: 190
注册时间: 2003-05


Re: 使用那种模式? 发表时间: 2004年02月28日 22:42:18 回复

Strategy 是通过聚合传参数的方式, 然后使用多态的方式, 实例化成不同的子类, 通过这样达到一种动态的面向接口的编程. 这在设计模式中用的很多, Factory Method相对简单, 没有使用聚合传参数方式, 只用到了多态.
还有一种更复杂的方式就是: 聚合传参数+多态+重定向(delegation), 象visitor.

__________________
学而不思则罔,思而不学则呆


banq

发表文章: 2231
来  自: 上海
注册时间: 2002-08


Re: 使用那种模式? 发表时间: 2004年02月29日 09:58:19 回复

strategy比较合适

__________________
原创J2EE电子教程 http://www.jdon.com/ejbtur.htm

可以使用工厂加Strategy模式的方式。

将具体算法规则封装成子类,对外界只有一个接口方法getFile(),至于getFile()具体实现,是从本地或从远程?这是两种算法,由程序员或配置定义。

当然还可能用Proxy模式,设定一个Proxy类,提供getFile()行为,getFile()行为作一个Cache检测,如果当前缓存无,则从本地文件读,如果本地文件没有,则从远程读。

在网络远程编程中,一般都使用Proxy模式,会提高性能。

所以具体模式选择,取决于你的需求,和你的前提条件,即所谓的场景。

看了一些Strategy模式的资料,感觉Strategy有这样的要求:
父类CStrategy有一个纯虚函数AlgorithmInterface,其子类CSubStrategy1,CSubStrategy2,...等重载该AlgorithmInterface函数。这里,父类CStrategy里只能有且仅有一个纯虚函数AlgorithmInterface,不能再有另一个纯虚函数AlgorithmInterface2。不知我理解的对不对?

另外想请教下面一种情况,该使用何种设计模式?
客户程序Client运行时需要存/取一个参数paraValue, 这个参数或者存放在一个文件paraFile中,或者存放在类似WIN32的注册表Register中。我们设计了一个基类CParaAccess,有两个纯虚函数getPara()和 setPara()。从基类CParaAccess继承了两个子类CParaFileAccess和
CParaRegisterAccess。类CParaFileAccess和CParaRegisterAccess根据系统对文件和注册表不同的访问方式分别实现getPara()和 setPara()。考虑到将来参数paraValue还可能存放在别的地方,如数据库中,可能需要设计新的子类如CParaDatabaseAccess。子类CParaDatabaseAccess的函数
getPara()和 setPara()应该和CParaFileAccess或CParaRegisterAccess的getPara()和 setPara()函数实现不一样。请问:子类CParaFileAccess、CParaRegisterAccess、CParaDatabaseAccess这样的设计是否
符合Strategy模式?还是利用别的模式来进行设计能满足需求?
在构造子类CParaFileAccess、CParaRegisterAccess、CParaDatabaseAccess的实例时可否利用Factory Method模式?
谢谢!!

>在构造子类CParaFileAccess、CParaRegisterAccess、CParaDatabaseAccess的实例时可否利用Factory Method模式?

可以使用工厂模式,一般都是这么用的。

关于Strategy模式,能否讨论一下基类该如何设计?能否有多个虚接口?
我举的例子中CParaFileAccess、CParaRegisterAccess、CParaDatabaseAccess是否符合Strategy模式?
谢谢!


-------------
看了一些Strategy模式的资料,感觉Strategy有这样的要求:
父类CStrategy有一个纯虚函数AlgorithmInterface,其子类CSubStrategy1,CSubStrategy2,...等重载该AlgorithmInterface函数。这里,父类CStrategy里只能有且仅有一个纯虚函数AlgorithmInterface,不能再有另一个纯虚函数AlgorithmInterface2。不知我理解的对不对?

另外想请教下面一种情况,该使用何种设计模式?
客户程序Client运行时需要存/取一个参数paraValue, 这个参数或者存放在一个文件paraFile中,或者存放在类似WIN32的注册表Register中。我们设计了一个基类CParaAccess,有两个纯虚函数getPara()和 setPara()。从基类CParaAccess继承了两个子类CParaFileAccess和
CParaRegisterAccess。类CParaFileAccess和CParaRegisterAccess根据系统对文件和注册表不同的访问方式分别实现getPara()和 setPara()。考虑到将来参数paraValue还可能存放在别的地方,如数据库中,可能需要设计新的子类如CParaDatabaseAccess。子类CParaDatabaseAccess的函数
getPara()和 setPara()应该和CParaFileAccess或CParaRegisterAccess的getPara()和 setPara()函数实现不一样。请问:子类CParaFileAccess、CParaRegisterAccess、CParaDatabaseAccess这样的设计是否
符合Strategy模式?还是利用别的模式来进行设计能满足需求?
在构造子类CParaFileAccess、CParaRegisterAccess、CParaDatabaseAccess的实例时可否利用Factory Method模式?
谢谢!!

Strategy相对简单容易理解,并且可以在运行时刻自由切换,如果需要这样,那么使用Strategy模式,至于如何设计,
很简单,设计一个抽象类和接口,几个算法实现,一个Solver类。Strategy模式比较容易实现的。