当我们注意到在我们代码结构中超过一个类使用到另一个特殊类中的同一个方法时,此时应该将该类中的方法提取出来放到一个接口( interface )中,并对外提供这个接口以便被用户类访问、使用,这样有利于打破原来多个类与这个特殊类的依赖关系。这个重构手法很容易实现,更重要的是这样做有利于松耦合。
先瞧瞧重构前的代码:
class ClassRegistration {
public void createCode() {
// create registration code
}
public void transfer() {
// class transfer code
}
public double getTotal() {
return 0.01;
}
}
class RegistrationProcessor {
public double processRegistration(ClassRegistration registration) {
registration.createCode();
return registration.getTotal();
}
}
在上面例子中,如果有多个不同的 RegistrationProcessor 类需要自主性地选择不同的注册方式,也就是说,注册 ClassRegistration 类同样有多个不同的实现方法。但是在上面的代码中, RegistrationProcessor 类很明显已经与单独一个 ClassRegistration 类紧耦合了,并不能选择性地与其他具体的实现相关联。
为了解决这种不足,我们把 ClassRegistration 类中的 create() 方法提取出来,再放到一个新的接口( interface )中,先看重构后的代码:
interface IRegistration {
public void createCode();
public double getTotal();
}
class ClassRegistration implements IRegistration {
@Override
public void createCode() {
// create registration code
}
public void transfer() {
// class transfer code
}
@Override
public double getTotal() {
return 0.01;
}
}
class RegistrationProcessor {
public double processRegistration(IRegistration registration) {
registration.createCode();
return registration.getTotal();
}
}
重构之后, ClassRegistration 类实现了 IRegistration 接口,并实现了该接口中所声明的所有方法,在 ClassRegistration 类中用 @Override 表明了。注意,最重要的是 RegistrationProcessor 类(也就是客户类)在自己的 processRegistration() 方法中,其参数类型不再是具体的 ClassRegistration 类,而是 IRegistration 接口。如此一来,我们可以提供多个实现了 IRegistration 接口的不同实现类,然后由具体传入 processRegistration() 方法的参数来运行时确定究竟是哪种实现。
实际上,这是我们常说的“面向接口编程”,也就是运用多态机制的好处。重点在于用户类不必与具体的实现类直接依赖,而是依赖于抽象的接口。
本文转自 xxxx66yyyy 51CTO博客,原文链接:http://blog.51cto.com/haolloyin/347473,如需转载请自行联系原作者