一’Java 接口作为方法参数好处:
1 可以很方便封装起来,供调用者使用;
2 参数为接口类型可以实现代码解耦;
3 对调用者而言, 无需关心内部构造逻辑 , 只要实现调用相关方法 实现自己的下部逻辑即可,做到开箱即用的效果;
4 我们翻看jdk源码发现大量这样应用的代码;
...........................
下面我们就举例实现说明
二 什么是接口作为方法参数
用户人 基类 ,方法应用时候用到
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 用户人 基类
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Person {
/**
* 名字
*/
private String name;
/**
* 年龄
*/
private Integer age;
/**
* 语言
*/
private String lange;
}
/**
*说话接口
*/
public interface Speak {
void speackByLange(String name, String lange);
void speakNull();
}
抽象实现类
import lombok.extern.slf4j.Slf4j;
/**
* 说话抽象类
*/
@Slf4j
public abstract class DoSpeak implements Speak{
@Override
public void speackByLange(String name, String lange) {
log.info( name + "do " + lange);
}
@Override
public void speakNull() {
log.info("speck null ...");
}
}
工作类 主要
import lombok.extern.slf4j.Slf4j;
/**
* 工作 处理用户做接口的关系处理 这里直接引用实体的name, lanage 在实际使用中
* 可以 有其他处理逻辑 如 加密解密,记录日志 , 以及转换算法 这里就简单处理了。。。
*/
@Slf4j
public class Work {
public void doOk(Person person, Speak speak) {
if (person != null) {
log.info("person:" + person.toString());
speak.speackByLange("(name)" + person.getName(), "(lange)" + person.getLange());
} else {
log.info("person is null");
speak.speakNull();
}
}
}
测试类 说明:
//重写抽象方法 ,然后具体做什么事情, 重写了两种方法, 一种是person不为空的情况 //另一种是person 为空的情况, 这样我们就封装了person和 speak的内部关系, 直接重写 //speack接口的方法, 来实现我们具体的需求 //在实际应用中,可能要重写 success方法和fail方法,这里只是简单重写一下
public class Test001 {
public static void main(String[] args) {
Person person = Person.builder().name("tom").age(12).lange("chinese").build();
Work work = new Work();
work.doOk(person, new DoSpeak() {
@Override
public void speackByLange(String name, String lange) {
System.out.println("名字:" + name + " can speak " + lange);
}
@Override
public void speakNull() {
System.out.println("speack is null " );
}
});
}
执行结果如下: