问题描述
在代理模式中(纯手动,不用InvocationHandler)为了生成代理对象,一般用原对象类抽象出接口,然后原对象类和代理对象类都实现这个接口,这样,可以适用原对象的地方也可以使用代理对象了,然后再在代理对象中加入我们新增的验证之类的功能,大功告成!但是我很好奇 这样对原对象来说算不算污染?因为对于Struts和Struts2或者EJB和Hibernate 就因为多继承了个类或者多实现了个接口,书上就管这个叫做代码污染,或者说影响了扩展性那这样实现的代理模式是不是也是污染了代码呢?还是说为了代码的可扩展性 这些牺牲是微不足道的呢?小弟才疏学浅 叙述疏漏望指正:)
解决方案
添加接口是为了代码的扩展性,这种污染不算是污染,污染是要实现某项功能必须粘合一堆不理解的api,就像struts1中的actionform,使用者不理解为什么要写个servlet就必须用这个api,而这个接口你是理解的,是一个扩展接口。如果spring每次配置一个bean都必须让那个bean继承某个BaseBean,那就是一种污染。污染更多的来自与继承,而非接口与组合。
解决方案二:
首先,你得明白什么是接口污染的定义,那就是在一个实现类中,实现了与业务无关的方法,而此方法仅仅是一个必要实现,为了不报错嘛,这个对于系统来说是非常危险的事,假如用户不小心使用了此方法,带来的后果是不可预测的,对于更小粒度的实现来说,为了不造成接口污染,在6大设计原则里面有明确的接口分离原则,目的就是为了避免接口污染,你可以再考虑下你的模式,思考下是否有接口污染的冲突存在,谢谢!
解决方案三:
我觉得只要每个接口的粒度合适(方法个数控制在一定范围之内),具体类所实现的接口个数适当(取决于业务的复杂程度和具体类的职责),就不存在污染不污染,设计本身就是寻找一种平衡,简单明了就好。