若干客户使用类接口中的同一子集,或者2个类的接口部分相同。将相同的子集提炼到一个独立接口中。
动机:类之间彼此互用的方式有若干种。“使用一个类”通常意味着用到该类的所有责任区。另一种情况是,某一组客户只使用类责任区中的一个特定子集。再一种情况是,这个类需要与所有协助处理某些特定请求的类合作。
对于后2种情况,将真正用到的这部分责任分离出来通常很有意义,因为这样可以使系统的用法更清晰,同时也更容易看清系统的责任划分。如果新的类需要支持上述子集,也比较能够看清子集内有些什么东西。
在许多面向对象语言中,这种责任划分是通过多继承来实现的。在c#中可以运用接口来诏示并实现上述需求。
Extract Subclass (提炼子类)和Extract Interface (提炼接口)之间有些相似之处。Extract Interface (提炼接口)只能提炼共通接口,不能提炼共通代码。使用Extract Interface (提炼接口)可能造成难闻的“重复”坏味道,幸而你可以运用Extract Class(提炼类)先把共通行为放进一个组件中,然后将工作委托给该组件,从而解决这个问题。如果有不少共通行为,Extract Superclass (提炼超类)会比较简单,但是每个类只能有一个超类。
如果某个类在不同环境下扮演截然不同的角色,使用接口就是个好主意。你可以针对每个角色以Extract Interface (提炼接口)提炼出相应接口。另一种可以用Extract Interface (提炼接口)的情况是:你想要描述一个类的外部依赖接口。如果你打算将来加入其它种类的服务对象。只需要求它们实现这个接口即可。