发帖    主题    评论    推荐    标签    作者    订阅    查搜    注册   登陆   关注
 
面向对象 设计模式 领域驱动设计 企业架构 框架 开发教程 微服务 CQRS 扩展性 并发编程 事件溯源 分布式 SOA

从设计模式中去掉接口

         
2006-03-10 12:45
赞助商链接

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

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

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

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

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

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



WorkImpl squarePeg = new WorkImpl();
Decorator decorator = new Decorator(squarePeg);
decorator.insert();


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

WorkImpl2 squarePeg = new WorkImpl2();
Decorator2 decorator = new Decorator2(squarePeg);
decorator.insert();


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


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


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

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

其他的设计模式也是同样的道理,我看了几个,都可以把其中的接口通通换成类来实现.
大家也可以试试,目的都是减少代码,使系统灵活,而他们都能达到目的.

1
2006-03-11 09:49

比较精僻,呵呵。
不过,写成接口的形式只是为以后的扩展或应用打开基础。
就像现在的建筑,都只做成框剪结构,其余的事情由后来人随便装修。
你现在的情况就像是在砖混结构上进行小面积装修。
随便说说看法,大家一起讨论一下。

2009-07-29 14:30

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

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

2009-08-11 16:31

我想你的意思其实是用接口的理念去用类,类的方法也可以被重写,和接口的实现一样
可以实现扩展的灵活性。
为什么要用接口,很重要的原因我想跟java的语法有关吧,
class 可以 implemments 无限个interface, 而只能extends 一个class。

设计模式      接口实现     

赞助商链接

赞助商链接

返回顶部

移动版 关于本站 使用帮助 联系管理员 最佳分辨率1366x768
OpenSource JIVEJDON Powered by JdonFramework Code © 2002-20 jdon.com