接口是软件工程最重要的概念,在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中什么是接口?它有什么作用? Java中什么是抽象类?它有什么作用? Java中什么是final关键字?它有什么作用? Java中什么是static关键字?它有什么作用? Java中什么是包?它有什么作用? Java中什么是异常?它...
3、Java中的final关键字有什么作用? 4、Java中的静态变量和实例变量有什么区别? 5、Java中的重载和重写有什么区别? 6、Java中的抽象类和接口有什么区别? 7、Java中的线程是什么? 8、Java中的synchronized关键字...
关于java接口的作用的讨论~~大家可以看一下,希望对大家有帮助~~
Java中interface接口的作用
什么是Java中的函数式接口?列举一些常见的函数式接口。 什么是Java中的Stream API?它的作用和使用场景是什么? Java中的GC(垃圾回收)是什么?如何手动触发对象的垃圾回收? 什么是Java中的设计模式?列举一些...
如何理解接口的作用? 继承是存在于面向对象程序中两个类之间的一种关系。使用继承的主要优点是使程序结构清晰,降低编码和维护的工作量。JAVA中不支持多重继承,而是通过接口实现比多重继承更强的功能,Java通过...
请解释Java中的抽象类和接口的概念及区别是什么? 请解释Java中的泛型(Generic)是什么?它有什么作用? Java中的异常处理机制是什么?如何处理异常? 请解释Java中的多线程是什么?如何创建多线程? Java中的反射...
final 在 java 中有什么作用? java 中操作字符串都有哪些类?它们之间有什么区别? 如何将字符串反转? String 类的常用方法都有那些? 接口和抽象类有什么区别? Files的常用方法都有哪些? java 容器都有哪些? ...
Java中接口的作用.pdf
1. 解释什么是Java,它的主要应用场景是什么? 2. Java有哪些不同的版本?它们之间有哪些主要的区别? 3. 解释Java语言中的面向对象编程是什么?举一个例子说明。...它们在项目管理和构建中有什么作用?
什么是Java中的函数式接口?列举一些常见的函数式接口。 什么是Java中的Stream API?它的作用和使用场景是什么? Java中的GC(垃圾回收)是什么?如何手动触发对象的垃圾回收? 什么是Java中的设计模式?列举一些...
Java中 @PostConstruct和@PreDestroy注解有什么作用?编写Webservice接口服务端(框架)有几种方式?常用的缓存框架有哪几个?简述TCP三次握手的理解 Linux下你常用的命令有哪些?Nginx有什么作用?
1. 了解Java 中包(package)、接口(interface)的作用。 2. 掌握包、接口设计方法。 【实验要求】 1. 了解Java 系统包的结构。 2. 掌握创建自定义包的方法。 3. 掌握使用系统接口的技术和创建自定义接口的方法。...
2. Java中的继承和接口有什么区别? 3. Java中的线程和进程有什么区别? 4. Java中的反射机制是什么?它的作用是什么? 5. Java中的访问修饰符有哪些?它们的使用场景是什么? 数据库基础题: 1. SQL语言中有哪些...
这些接口有什么作用? USB接口 USB-A 1. 鼠标连接,键盘连接,声卡连接,麦克风,摄像头,补光灯,U盘,移动硬盘 2. 规范,都是USB设备 3. 设备本身决定了,要做什么事情。 2. Java中接口使用 格式: interface 接口...
46、java 中实现多态的机制是什么? 12 47、在java 中一个类被声明为final 类型,表示了什么意思? 12 48、下面哪些类可以被继承? 12 49、指出下面程序的运行结果: 【基础】 13 52、关于内部类: 13 53、数据类型...
abstract class,只可以包含抽象方法,也包括一些常量的定义,丝毫不带半点实现细节,它只提供接口,可以有数据成员,默认是、同时也必须是static & final型,可以通过Interface name直接访问。Interface可以实现...
4.final 在 java 中有什么作用? 5.java 中的 Math.round(-1.5) 等于多少? 6.String 属于基础的数据类型吗? 7.java 中操作字符串都有哪些类?它们之间有什么区别? 8.String str="i"与 String str=new String(“i...
final 在 java 中有什么作用? java 中的 Math.round(-1.5) 等于多少? String 属于基础的数据类型吗? java 中操作字符串都有哪些类?它们之间有什么区别? String str="i"与 String str=new String("i")一样吗? ...