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

04-02-29 myzhai
上述问题没有描述地特别清楚。

我们的问题是:

我们需要读/写一个文件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

    

banq
2004-03-01 12:06
可以使用工厂加Strategy模式的方式。

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

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

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

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

myzhai
2004-03-01 23:31
看了一些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模式?

谢谢!!

banq
2004-03-03 09:47
>在构造子类CParaFileAccess、CParaRegisterAccess、CParaDatabaseAccess的实例时可否利用Factory Method模式?

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

myzhai
2004-03-03 11:35
关于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模式?

谢谢!!

猜你喜欢
2Go 1 2 下一页