关于抽象类的具体应用场景
learnnowjava吧
全部回复
仅看楼主
level 9
tuzi215 楼主
昨天看到有人问到抽象类的意义以及使用。抽象类的使用只是看书上介绍的话有时不能了解它能给我们来的的好处到底有多大。以下用一个具体示例更直观的展示抽象类的使用,相信读完它会对抽象类的使用有一个更深入的了解。
1.有一个应用产品在不同地方实施的时候都需要集成一个第三方的邮件系统。
2.最基础的功能就是要在我们的应用中通过调用第三方邮件系统接口取得未读邮件数并在应用中显示给用户。
3.每个地方的邮件系统可能来自不同公司,有的是socket接口有的是webservice接口,具体调用方法也不一样。
根据以上情况要求设计一种快速简便的集成方式,让实施集成的开发人员可以根据既定接口快速集成。
首先应该能够想到,我们应该有一个类,用于调用第三方邮件系统接口。其中至少应该有一个getUnreadMailCount()方法。我们的程序调用这个方法取得未读邮件数。
也就是说现在我们应该有一个如下的类 :
public class
MailCommand{
public String getUnreadMailCount(String account){
// 这里使用传入参数account,也就是邮件账号,通过webservice或socket接口
// 获取未读邮件数
}
}
根据上方第3点,接口有可能是socket或者webservice方式,根据面向接口编程的思想,为了让业务代码和获取未读邮件数方法实现解耦,决定将上方的类抽象为一个接口,并且使用实现类实现接口。这样,业务代码中只需要调用接口的
getUnreadMailCount方法,即使具体实现类发生变动也不需要改动业务代码,这里以socket方式为例:
public interface
MainCommand{
public String getUnreadMailCount(String account);
}
// socket方式的实现类
public class SocketMailCommand implements MailCommand{
public String getUnreadMailCount(String account){
//具体实现
}
}
接下来看看这个实现类SocketMailCommand,现在这个实现类中只有一个getUnreadMailCount方法,实际上这个类中还可能会有获取所有邮件数方法,更改密码等方法。socket方式调用第三方邮件系统接口,一般需要先获取socket连接, 然后发送命令,再获取返回值。
获取socket连接部分的代码一般是不变的,所以需要将获取socket连接的代码提取出来单独封装为一个方法,暂时命名其为getSocket()。发送命令的方法一般也不会变动,我们封装为executeCommand()方法。
因为有这两个一般不会变动的方法,所以考虑再抽象出一个抽象类实现MailCommand接口。
如下:
//这个抽象类实现了MailCommand接口
public abstract class
AbstractSocketMailCommand implements
MailCommand{
String excuteCommand(Socket clientSocket, List<String> command){
// 通过已经建立的socket连接对象clientSocket,按顺序执行command列表中的命令
// excuteCommand为内部方法所以没有标识为public
}
Socket getSocket(String server, int port){
//通过服务器地址以及端口参数获取socket连接并返回
}
}
// socket方式的实现类,继承自AbstractSocketMailCommand抽象类
public class
SocketMailCommand extends
AbstractSocketMailCommand {
public String getUnreadMailCount(String account){
//具体实现
}
}
通过抽象类的引入,不同项目的实施人员在做集成工作时,不再需要自己写建立socket连接以及通过socket连接发送命令的方法,只需要继承抽象类根据具体第三方公司的文档实现
getUnreadMailCount()等方法就行。这是抽象类的一个好处。
另外有一个细节在
抽象类中
excuteCommand()方法中向socket连接发送命令并获取返回值,我们要通过返回值判断执行方法是否成功,这里有一个问题,发送命令的返回值是由第三方邮件系统返回的,每个项目中不同第三方返回值可能不同,判断是否执行成功的规则也不相同。那么我们怎么在
excuteCommand中编码实现判断是否执行成功呢?这里也能利用抽象类的特性来完成这个任务,在
AbstractSocketMailCommand抽象类中添加一个抽象方法,如下:
abstract boolean
isExecuteSuccessful(String result);

excuteCommand方法中使用如下代码判断执行是否成功,代码如下:
line = in.readLine(); // 读取socket命令返回值
// 根据返回值 用isExecuteSuccessful方法判断是否执行成功,如果执行成功再继续处理
// 返回值,isExecuteSuccessful在AbstractSocketMailCommand中是抽象方法,相当于
// 给子类定义了一个模版,子类若非抽象类则必须实现这个方法,这就能保证不同项目
// 的实施开发人员能根据不同的规则实现此方法,保证了excuteCommand方法的正常
// 执行。
if (line != null && isExecuteSuccessful(line)) {
//isExecuteSuccessful返回成功再继续处理line变量中的返回值
}
通过这个例子能看到,抽象类不但可以实现代码复用,还可以作为模版限制实现抽象类的子类。
可能讲的不是太容易理解,有问题欢迎交流
2014年01月31日 21点01分 1
1