`
gemantic
  • 浏览: 335864 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java 中的接口有什么作用?

 
阅读更多
接口是软件工程最重要的概念,在java上要格外感谢Spring的贡献。
这个概念对于新人来讲,是比较难理解的,最重要的原因就是需要有一定的代码量,特别是做过一些项目的重构,维护,变更等事情的时候感触才会更深一些。

1 “接口+实现”最常见的优势就是实现类和接口分离,在更换实现类的时候,不用更换接口功能。

比较常见的例子是发送短信。
一般发送短信的场景包括注册用户,找回密码,重要通知,修改交易密码等。

短信现在的结构是先接上各家短信通道公司,再经由联通移动等发送出去。

一般而言,短信分成两种,一种注册短信,一次只发给用户一条。这种短信到达率比较高,可能会在99%以上,也要看各种短信通道方,更会区分移动和联通。
另外一种是营销短信,这种短信常见于“某公司3周年大庆,1元领取程序员鼓励师”之类的。

这种短信到达率非常低。而且也经常会被封掉。

但是短信又是注册的第一步,用户体验做的再好,手机收不到验证码也没用。
所以觉见的做法是,会备用两个或者是多个短信通道。

刚刚已经讲过了,调用短信接口的地方比较多,可能是用户发起的,也可能是程序检测到某种行为触发的。

也就是说,会有多个地方调用短信接口,那么我们这个时候要解决的问题就是,能否在更换短信通道方的时候,不更改其他模块中被引入的代码?

接口在这个时候就完美的实现了这个功能点。无论是哪个模块,我要发送的内容和预期的结果是一致的,具体是用哪家短信通道的实现类,不重要。

所以通常是一个SMSService做为接口,不同的公司因为有不同的实现方式,所以会有多个实现类,比如说SMSService{CorpA}Impl,SMSService{CorpB}Impl。

这是一个完美的抽象,无论未来有多少种短信公司接入,无论短信公司的营销人员送了多少个香吻给公司的商务总监,程序员总是能够开心的完成功能。

2.这对于做单元测试也非常有帮助。

如果你是一个有了那么点经验的程序员,如果你还没有习惯TDD的开发。可以体验一下这种写法。还是拿短信为例。

先写一个SMSServiceTest。

然后写一个Test方法。

这个时候什么都没有,不用管。先直接这么写。

int code=SMSSevice.sendTextMessage(mobile,content,type);

这个时候IDE会提示你没有这个SMSService,用代码自动生成工具去创建这么一个接口出来。
再根据提示把方法创建出来。

再写 SMSService smsService=new SMSServiceCorpaImpl();

再根据代码把实现类生成了。一般来说IDE会自动留一个空的方法。不用管。

这里只是一个简单的例子,但是你发现,当你用TDD的这种方式去写代码的时候,完全不用关系SMSService是怎么内部实现的。

你只需要继续写你的单元测试代码好了,明确的知道这个SMSService要做的功能是发送短信,需要传递手机号,内容,类型,返回一个状态码。

那么接着说为什么对单元测试很方便?
一般而言会用Spring配置Bean,所以实际上你的单元测试代码也不用有改动,无论是测试哪一个实现类,都只通过更改配置文件就可以完成。

想想,如果没有接口呢?

是不是要对每一个短信通道单独写一个单元测试的方法?

3.对于不需要频繁更变实现类的方法,是不是就可以不用写接口了?

答案是No。整个系统架构的代码可以单纯认为有四部分构成。Model+Interface+Service+Util

Model是纯粹的Pojo,贫血模型,Inteface和Service是接口和实现分开的,Util是全项目通用,或者是跨项目通用的,跟业务逻辑没有任何关系的。

写接口最大的好处就是在你写的Controller代码,或者是Service里的主要业务逻辑代码的时候,屏蔽掉细节。

写一个业务逻辑的时候,比如说修真院的加入班级。
第一步,做校验,用户是否为空,班级是否不存在,是否已经加入了班级等等。
第二步,更新班级和用户的关系表,更新班级总人数,更新职业总人数,更新用户的最新班级ID。
第三步,发送系统通知,告知用户加入班级成功。

如果说不用接口,只用实现类的话,第一种方式就是把所有的代码都写在这个Controller里去,代码会非常非常繁琐,一个函数突破几千行轻轻松松,而且改动起来很麻烦。

第二种方式就是抽象出来函数。这种方式在某种程度上能够解决代码块大的问题,但是你必须要New一个实现类出来,想想在上述逻辑中,需要new几个实现类?

这些实现类就会被New的各处都是,甚至改个名字都很蛋疼。


但是如果你使用接口的话,你会发现,接口是强制于你去将复杂的业务逻辑抽象成具体做的事儿。


比如说,
if(user==null){
// to do something
}

就变成了CheckUser(uid)这么一个接口。实现类也明确了自已要做的事情。

从某种程度上来说,抽象成一个私有方法也能解决这个问题,但是一般都会推荐,如果你发现你写了很多私有方法,要么是他们可以继续演化成一个util,要么是可以成为一个Service。


嗯,说的有点乱。
分享到:
评论

相关推荐

    java面试常见问题(超详细).pdf

    Java中什么是接口?它有什么作用? Java中什么是抽象类?它有什么作用? Java中什么是final关键字?它有什么作用? Java中什么是static关键字?它有什么作用? Java中什么是包?它有什么作用? Java中什么是异常?它...

    20道JAVA面试题.docx

    3、Java中的final关键字有什么作用? 4、Java中的静态变量和实例变量有什么区别? 5、Java中的重载和重写有什么区别? 6、Java中的抽象类和接口有什么区别? 7、Java中的线程是什么? 8、Java中的synchronized关键字...

    java中接口的作用

    关于java接口的作用的讨论~~大家可以看一下,希望对大家有帮助~~

    Java中interface接口的作用

    Java中interface接口的作用

    java经典面试题目-面经-java-Java语言的进阶概念-常用的库和框架-并发编程-网络编程-Web开发-面经

    什么是Java中的函数式接口?列举一些常见的函数式接口。 什么是Java中的Stream API?它的作用和使用场景是什么? Java中的GC(垃圾回收)是什么?如何手动触发对象的垃圾回收? 什么是Java中的设计模式?列举一些...

    java简答题

    如何理解接口的作用? 继承是存在于面向对象程序中两个类之间的一种关系。使用继承的主要优点是使程序结构清晰,降低编码和维护的工作量。JAVA中不支持多重继承,而是通过接口实现比多重继承更强的功能,Java通过...

    java面试常见问题.docx

    请解释Java中的抽象类和接口的概念及区别是什么? 请解释Java中的泛型(Generic)是什么?它有什么作用? Java中的异常处理机制是什么?如何处理异常? 请解释Java中的多线程是什么?如何创建多线程? Java中的反射...

    java面试题.docx

    final 在 java 中有什么作用? java 中操作字符串都有哪些类?它们之间有什么区别? 如何将字符串反转? String 类的常用方法都有那些? 接口和抽象类有什么区别? Files的常用方法都有哪些? java 容器都有哪些? ...

    Java中接口的作用.pdf

    Java中接口的作用.pdf

    Java 面试问题Java 面试问题示例

    1. 解释什么是Java,它的主要应用场景是什么? 2. Java有哪些不同的版本?它们之间有哪些主要的区别? 3. 解释Java语言中的面向对象编程是什么?举一个例子说明。...它们在项目管理和构建中有什么作用?

    mysql面试题-mysql经典面试题目-数据库的基本概念-SQL语法-事务处理-索引优化-性能调优-mysql-面试题目

    什么是Java中的函数式接口?列举一些常见的函数式接口。 什么是Java中的Stream API?它的作用和使用场景是什么? Java中的GC(垃圾回收)是什么?如何手动触发对象的垃圾回收? 什么是Java中的设计模式?列举一些...

    java面试题20道(适合工作1~3年)(附答案).docx

    Java中 @PostConstruct和@PreDestroy注解有什么作用?编写Webservice接口服务端(框架)有几种方式?常用的缓存框架有哪几个?简述TCP三次握手的理解 Linux下你常用的命令有哪些?Nginx有什么作用?

    java包与接口实验报告

    1. 了解Java 中包(package)、接口(interface)的作用。 2. 掌握包、接口设计方法。 【实验要求】 1. 了解Java 系统包的结构。 2. 掌握创建自定义包的方法。 3. 掌握使用系统接口的技术和创建自定义接口的方法。...

    大厂的Java面试题分享

    2. Java中的继承和接口有什么区别? 3. Java中的线程和进程有什么区别? 4. Java中的反射机制是什么?它的作用是什么? 5. Java中的访问修饰符有哪些?它们的使用场景是什么? 数据库基础题: 1. SQL语言中有哪些...

    java中的接口概略

    这些接口有什么作用? USB接口 USB-A 1. 鼠标连接,键盘连接,声卡连接,麦克风,摄像头,补光灯,U盘,移动硬盘 2. 规范,都是USB设备 3. 设备本身决定了,要做什么事情。 2. Java中接口使用 格式: interface 接口...

    java面试宝典

    46、java 中实现多态的机制是什么? 12 47、在java 中一个类被声明为final 类型,表示了什么意思? 12 48、下面哪些类可以被继承? 12 49、指出下面程序的运行结果: 【基础】 13 52、关于内部类: 13 53、数据类型...

    Java中抽象类和接口的区别与作用详解

    abstract class,只可以包含抽象方法,也包括一些常量的定义,丝毫不带半点实现细节,它只提供接口,可以有数据成员,默认是、同时也必须是static & final型,可以通过Interface name直接访问。Interface可以实现...

    Java常见面试题208道.docx

    4.final 在 java 中有什么作用? 5.java 中的 Math.round(-1.5) 等于多少? 6.String 属于基础的数据类型吗? 7.java 中操作字符串都有哪些类?它们之间有什么区别? 8.String str="i"与 String str=new String(“i...

    Java 最常见的 208 道面试题:第一模块答案

    final 在 java 中有什么作用? java 中的 Math.round(-1.5) 等于多少? String 属于基础的数据类型吗? java 中操作字符串都有哪些类?它们之间有什么区别? String str="i"与 String str=new String("i")一样吗? ...

Global site tag (gtag.js) - Google Analytics