首页 新闻 搜索 专区 学院

询问一个设计模式

0
悬赏园豆:50 [已解决问题] 解决于 2010-03-14 15:15

场景

1、有许多独立的,可重复使用的方法

2、有不同的Model

3、不同的Model包含这上面说到的方法

     而这个包含不是继承的关系,应该说是无规律的关系

     Model 1 可能包含 方法1、3、5、6

     Model 2 可能包含 方法1、4、5、7

4、如果c#中类能多重继承的话就没问题了,关键就是c#中不能多重继承

5、而如果用接口的话,接口不能实现方法

6、用接口的扩展方法的话索然可以实现,但感觉不太好,从设计模式上来讲不太好,换个语言就不能用了,因为这是c#很特殊的一种性质

 

用哪种设计模式比较好?

Dozer的主页 Dozer | 初学一级 | 园豆:30
提问于:2010-03-12 08:49
< >
分享
最佳答案
0

其实遇到这种情况,不应该直接套用某种模式去解决问题。在遇到这种代码“坏味道”的时候,应该首先想到重构。根据设计原则一步步地重构,到最后自然会想到使用组合的方式去实现。此外,我建议你对每个重用的方法都封装成一个类,如将方法1封装进类1,而不是将方法1和方法5封装进同一个类15,因为你现有系统中方法的使用时交织在一起的,每个类一个方法的话可以更灵活一些。

对于你所说的第6点,我不敢苟同。为什么因为扩展方法是C#特有的就不去使用了呢?如果这么总是这么想,那任何语言都不用发展了,因为大多数特性都是这门语言所特有的,换成别的语言就不能用了。泛型也别用了,Lambda表达式也别用了,委托也别用了……

其实,之所以出现这些设计模式,就是因为一些语言无法(更好地)实现某些功能。而对于那些内置这些功能的语言来说,就没有必要特意去套用某种设计模式了。比如C#中有了foreach,就没必要去套用Iterator模式了。我觉得扩展方法的目标之一恰恰就是为了实现你这种需求,而你却因为它的特殊性而不愿使用,C#设计者肯定泪流满面了。

如果你的项目就是使用C#开发,就是用扩展方法来解决这个问题吧,不要犹豫。如果你的项目很可能会改变成另外一种语言开发,那就是用组合去实现吧。但是这种概率究竟有多大呢?

收获园豆:50
麒麟.NET | 老鸟四级 |园豆:3614 | 2010-03-12 11:04
其他回答(3)
0

这种情况比较常见,个人觉得用继承是不很合适的,应该采用对象组合的方式来实现。

你的方法1、2、3、4、5、6应当按照对应的逻辑关系放到对应的类里面

然后通过组合的形式被Model所包含

查尔斯 | 园豆:3832 (老鸟四级) | 2010-03-12 10:33
0

模式不是死板的硬套上的,也是穿插应用的,我觉得你说的问题用多态的思想就可以解决了

茂茂 | 园豆:2860 (老鸟四级) | 2010-03-12 14:28
0

如果每个方法对应一个类,这个类中包含一个引用列表,即包含不同的Model,不同德Model包含一个方法类的引用列表。

我的个人想法

小丁 | 园豆:301 (菜鸟二级) | 2010-03-13 09:50
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册