提取接口(Extract Interface)

简介:

当我们注意到在我们代码结构中超过一个类使用到另一个特殊类中的同一个方法时,此时应该将该类中的方法提取出来放到一个接口( 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,如需转载请自行联系原作者

相关文章
重构——10搬移函数(Move Method)
搬移函数(Move Method):你的程序中,有个函数与其所驻类之外的另一个类进行更多的交流:调用后者,或者被后者调用。在该函数最常引用的类中建立一个有着类似行为的新函数。将就函数变成一个单纯的委托函数,或是将旧函数完全移除
3719 0
|
数据可视化 uml
UML图讲解(关联关系,单向关联,双向关联,自关联,组合关系,依赖关系,继承关系,实现关系)
UML图讲解,关联关系,单向关联,双向关联,自关联,组合关系,依赖关系,继承关系,实现关系。
5854 0
UML图讲解(关联关系,单向关联,双向关联,自关联,组合关系,依赖关系,继承关系,实现关系)
|
弹性计算 缓存 监控
基于“日志审计应用”的 DNS 日志洞察实践
DNS 解析日志是一种记录 DNS 请求和响应的基础信息,监控 DNS 服务可以帮助用户识别网络活动并保持系统安全。日志审计服务支持采集 DNS 内网解析日志、公网权威解析日志、GTM 日志。理解 DNS 日志的字段含义,洞察 DNS 日志背后所代表的网络信息,既可以帮助发现和诊断 DNS 解析相关的问题,还可以检测和识别潜在的安全威胁。
8756 118
|
机器学习/深度学习 数据采集 算法
基于贝叶斯算法的手机垃圾短信过滤
基于贝叶斯算法的手机垃圾短信过滤
|
安全 网络安全 数据安全/隐私保护
`certifi`是一个Python包,它提供了一个包含Mozilla证书颁发机构(CA)Bundle的PEM文件。
`certifi`是一个Python包,它提供了一个包含Mozilla证书颁发机构(CA)Bundle的PEM文件。
|
分布式计算 安全 Hadoop
Hadoop安全性和数据保护机制
【8月更文第28天】随着大数据技术的普及,Hadoop已成为处理大规模数据集的核心技术之一。然而,随着数据价值的增加,数据安全问题变得越来越重要。本文将深入探讨Hadoop的安全模型以及如何实施访问控制、数据加密等措施来保障数据安全。
1031 0
|
存储 数据库 数据格式
深入理解依赖倒置原则(Dependence Inversion Principle)
深入理解依赖倒置原则(Dependence Inversion Principle)
1041 0
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的物流配送管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的物流配送管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
243 3
|
网络协议 Linux
TCP中两种保活方式
【4月更文挑战第7天】两种保活方式:Keep Alive和心跳包
|
存储 缓存 Linux
探秘Linux块设备驱动程序:成为内核开发大师的第一步
探秘Linux块设备驱动程序:成为内核开发大师的第一步
1015 1