从设计模式中去掉接口

06-03-10 lyojbuilder
我看了网站上写的关于设计模式的介绍,写的很精辟. 同时我发现一个现象,几乎所有的设计模式都是使用接口作为起点,而不是纯粹的类. 但是如果仔细考虑的话,这是增加工作量,完全可以把这些接口通通去掉,换成类来实现.例如 这篇文章: decorator

其中一段代码:

Work squarePeg = new SquarePeg(); 
Work decorator = new Decorator(squarePeg);
decorator.insert(); 
<p>

我完全可以把 Work 接口换成一个普通的类,再功能上都能实现Decorator模式.为什么一定要用接口,这无疑是增加工作量?

有几个理由要使用类而不是接口:

1.使用Decorator模式目的是为了在旧系统的基础上增加新的功能,但是往往旧的系统使用的全是类,而不是接口,就是说他们开始就没有把架构设计成接口形式的(这也没有什么不对的).所以就要适应他们的类环境.而不是到处都是接口.

2.使用类能达到同样的目的而且能减少代码,例如我把Work接口换成WorkImpl:

WorkImpl  squarePeg = new WorkImpl(); 
Decorator decorator = new Decorator(squarePeg);
decorator.insert();
<p>

这里我把接口全换成类,同样体现了Decorator的作用.有人会说接口灵活,可以有不同的实现,但这种说法站不住脚.假如我想把WorkImpl换成WorkImpl2类来实现,使用Decorator2来实现的话,我可以把上面代码改成:

WorkImpl2  squarePeg = new WorkImpl2(); 
Decorator2 decorator = new Decorator2(squarePeg);
decorator.insert();
<p>

如果使用接口,同样要改! 接口如下:

Work squarePeg = new SquarePeg2(); 
Work decorator = new Decorator2(squarePeg);
decorator.insert(); 
<p>

而且增加了设计接口和编写接口的工作量.

3.如果使用类的话,如果以后的类 WorkImpl变了,那麽,修改他的代码就可以,但如果使用接口,大家注意了,同样要改实现!也就是说仍然要改代码,所以使用接口的本质是没有变化的,实质并没有减小工作量.而增加的是编写接口的工作量.

其他的设计模式也是同样的道理,我看了几个,都可以把其中的接口通通换成类来实现.

大家也可以试试,目的都是减少代码,使系统灵活,而他们都能达到目的.

         

1
MiMiEye
2006-03-11 09:49
比较精僻,呵呵。

不过,写成接口的形式只是为以后的扩展或应用打开基础。

就像现在的建筑,都只做成框剪结构,其余的事情由后来人随便装修。

你现在的情况就像是在砖混结构上进行小面积装修。

随便说说看法,大家一起讨论一下。

yujw
2009-07-29 14:30
Work squarePeg = new SquarePeg2();

Work decorator = new Decorator2(squarePeg);

decorator.insert();

如果你用工厂模式创建的具体类,这段代码就不用改。

heweiweihe
2009-08-11 16:31
我想你的意思其实是用接口的理念去用类,类的方法也可以被重写,和接口的实现一样

可以实现扩展的灵活性。

为什么要用接口,很重要的原因我想跟java的语法有关吧,

class 可以 implemments 无限个interface, 而只能extends 一个class。

猜你喜欢