写优雅代码之聊一聊接口

来源:互联网 发布:ngrok nat123 知乎 编辑:程序博客网 时间:2024/05/16 01:19

一.常量接口

定义:用java接口来申明一些常量,然后由实现这个接口的类使用这些常量.

运用场景:可以用在app的开发中,比如url,发送的交易上

实现步骤:

1.首先定义一个常量接口

package com.hxl.constant;/** * 只要是实现了这个接口的实现类,都可以继承这些常量 *  * @author skythinking 常量接口 */public interface AppConstants {public static final int GOODSDETAILS = 30001;public static final int EVALUATION = 30004;/** 服务器 */public static final String APPURL = "http://www.baidu.com/";}

2.定义一个类实现这个接口,在实现类中就可以直接引用到这些常量

package com.hxl.constant;/** * 实现了AppConstants这个接口,就自动继承了它的常量 *  * @author skythinking * */public class AppConstantsImpl implements AppConstants {/** * 测试方法 *  * @param args */public static void main(String[] args) {System.out.println("打印在常量接口中定义的AppUrl常量:" + APPURL);System.out.println(GOODSDETAILS);}}

运行结果

打印在常量接口中定义的AppUrl常量:http://www.baidu.com/30001


二.回调接口

定义:用java接口来完成回调工作

运用场景:可以用在框架的设计中(比如该例中,老板让员工干活,但是老板没时间监督,就让员工做完事情通知他一声就成)

实现步骤:

1.定义一个用于回调的接口,并提供回调方法

package com.hxl.callback;/** * 回调的本质:通过接口变量持有实现类的引用,进而调用实现类的方法 *  * 此接口为留联系方式用(老板实现该接口,员工通过回调execute()方法,来通知老板干活情况) *  * @author skythinking *  *  */public interface CallBackInterface {// 用这个方法作为老板留下的联系方式,通过回调该方法,可以通知到老板public void execute();}

2.老板类实现回调接口,并实现回调接口中定义的方法

package com.hxl.callback;/** * 老板是作为上层应用身份出现的,下层应用(员工)是不知道 有哪些方法, 因此他想被下层应用(员工)调用必须实现CallBackInterface接口 *  * @author skythinking * */public class Boss implements CallBackInterface {@Overridepublic void execute() {System.out.println("老板回答:好的,收到了!!");}}

3.员工类通过持有回调接口,并通过set方法注入老板类的实现,而持有老板类的引用,进而回调到老板类中实现的接口方法

package com.hxl.callback;/** * 员工类,必须要记住,这是一个底层类,底层是不了解上层服务的 ,他必须持有老板的地址(回调接口),即使老板换了一茬又一茬,办公室不变,总能找到对应的老板。 *  * @author skythinking *  */public class Employee {// 持有老板的地址(即老板对象的引用),这里是向上转型private CallBackInterface callBack = null;/** * 通过set方法注入老板类的实例,进而持有它的引用(也就是注册) *  * @param callBack */public void setCallBack(CallBackInterface callBack) {this.callBack = callBack;}// 工人干活public void doSome() {// 1.开始干活了for (int i = 0; i < 10; i++) {System.out.println("员工说:第【" + i + "】事情干完了!");}// 2.告诉老板干完了/** * (这里就是回调了接口的execute()方法 * 而老板实现了CallBackInterface接口,通过setCallBack(CallBackInterface * callBack)注入进来的是老板类, 自然也就调用到老板类中的execute()方法 */if (callBack != null) {callBack.execute();} else {System.out.println("没有通过setCallBack(CallBackInterface callBack)注入实现了CallBackInterface的实现类");}}}

4.写测试类进行测试

package com.hxl.callback;public class Test {public static void main(String[] args) {Employee emp = new Employee();// 员工持有老板对象的引用(注册)emp.setCallBack(new Boss());// 开启控制器对象运行emp.doSome();}}

运行结果:

员工说:第【0】事情干完了!员工说:第【1】事情干完了!员工说:第【2】事情干完了!员工说:第【3】事情干完了!员工说:第【4】事情干完了!员工说:第【5】事情干完了!员工说:第【6】事情干完了!员工说:第【7】事情干完了!员工说:第【8】事情干完了!员工说:第【9】事情干完了!老板回答:好的,收到了!!


接口回调扩展知识:

1.在我们用一些开源框架的时候,当框架不能满足需求,我们想让框架来调用自己的类方法,怎么做呢?
总不至于去修改框架吧.许多优秀的框架提几乎都供了相关的接口,我们只需要实现相关接口,即可完成了注册.
然后在合适的时候让框架来调用我们自己的类

2.为了使我们写的项目接近完美,就把一部分功能外包给别人,让别人个性化定制,至于别人怎么实现不管,我唯一要做的就是定义好相关接口,这一设计允许了底层代码调用高层定义的方法,增强程序灵活性.


0 0