前言
场景:Java的关键字interface应用,一个接口,多个实现类。面向接口编程,把业务逻辑线提取出来作为接口,具体的业务实现通过该接口的实现类来完成。
版本:JDK 1.8。
1.一个Java接口
(1)说明
使用Java关键字interface修饰的类型,就是接口。
接口里面方法一般没有函数体,实际就是抽象方法。
比如:String announceStart();
接口里面方法有函数体情况,一般使用default关键字修饰。
比如:default String holdSportGame() { ...}
(2)代码
public interface SportContest { //开场仪式 String announceStart(); //举行比赛 ResultDto playGame(); //颁奖仪式 String announceEnd(ResultDto resultDto); //举行体育赛事 default String holdSportGame() { String result01 = announceStart(); ResultDto result02 = playGame(); String result03 = announceEnd(result02); return result03; } }
2.多个实现类实现同一个Java接口
实现Java接口使用implements关键字。
(1)实现类TableTennisContest
public class TableTennisContest implements SportContest { //赛事任务 private TaskDto taskDto = null; public TableTennisContest(TaskDto taskDto) { this.setTaskDto(taskDto); } @Override public String announceStart() { TaskDto taskDto = this.getTaskDto(); System.out.println("举行乒乓球比赛入场仪式:"); System.out.println("步骤一: " + taskDto.getEventName() + "队员入场."); System.out.println("步骤二: 裁判员、教练员等各就各位."); return "乒乓球比赛进行中"; } @Override public ResultDto playGame() { TaskDto taskDto = this.getTaskDto(); System.out.println("举行乒乓球比赛: " + taskDto.getContent() + ",选手们在奋力搏击."); return ResultDto.builder().teamName("中国乒乓球队").content("女单决赛冠军").build(); } @Override public String announceEnd(ResultDto resultDto) { System.out.println("举行颁奖仪式: "); System.out.println("步骤一: 为" + resultDto.getTeamName() + resultDto.getContent() + "颁发金牌."); System.out.println("步骤二: 升中华人民共和国国旗,奏中华人民共和国国歌."); return "乒乓球比赛圆满结束"; } public TaskDto getTaskDto() { return this.taskDto; } public void setTaskDto(TaskDto taskDto) { this.taskDto = taskDto; } }
(2)实现类SwimmingContest
public class SwimmingContest implements SportContest { //赛事任务 private TaskDto taskDto = null; public SwimmingContest(TaskDto taskDto) { this.setTaskDto(taskDto); } @Override public String announceStart() { TaskDto taskDto = this.getTaskDto(); System.out.println("举行游泳比赛入场仪式:"); System.out.println("步骤一: " + taskDto.getEventName() + "队员入场."); System.out.println("步骤二: 裁判员、教练员等各就各位."); return "游泳比赛进行中"; } @Override public ResultDto playGame() { TaskDto taskDto = this.getTaskDto(); System.out.println("举行游泳比赛: " + taskDto.getContent() + ",选手们在冲刺记录."); return ResultDto.builder().teamName("中国游泳队").content("男子组200米决赛冠军").build(); } @Override public String announceEnd(ResultDto resultDto) { System.out.println("举行颁奖仪式: "); System.out.println("步骤一: 为" + resultDto.getTeamName() + resultDto.getContent() + "颁发金牌."); System.out.println("步骤二: 升中华人民共和国国旗,奏中华人民共和国国歌."); return "游泳比赛圆满结束"; } public TaskDto getTaskDto() { return this.taskDto; } public void setTaskDto(TaskDto taskDto) { this.taskDto = taskDto; } }
3.示例测试
(1)说明
执行接口函数时,需先创建接口实现类的实例对象。
(2)代码
public class ApplyInterface { // 主函数入口 public static void main(String[] args) { System.out.println("*******************************"); holdSportGame(new TableTennisContest(TaskDto.builder().eventName("乒乓球比赛").content("女单决赛").build())); System.out.println("*******************************"); holdSportGame(new SwimmingContest(TaskDto.builder().eventName("游泳比赛").content("男子200米决赛").build())); System.out.println("*******************************"); } // 面向接口编程 public static void holdSportGame(SportContest sportContest) { sportContest.holdSportGame(); } }
(3)输出结果
*******************************
举行乒乓球比赛入场仪式:
步骤一: 乒乓球比赛队员入场.
步骤二: 裁判员、教练员等各就各位.
举行乒乓球比赛: 女单决赛,选手们在奋力搏击.
举行颁奖仪式:
步骤一: 为中国乒乓球队女单决赛冠军颁发金牌.
步骤二: 升中华人民共和国国旗,奏中华人民共和国国歌.
*******************************
举行游泳比赛入场仪式:
步骤一: 游泳比赛队员入场.
步骤二: 裁判员、教练员等各就各位.
举行游泳比赛: 男子200米决赛,选手们在冲刺记录.
举行颁奖仪式:
步骤一: 为中国游泳队男子组200米决赛冠军颁发金牌.
步骤二: 升中华人民共和国国旗,奏中华人民共和国国歌.
*******************************
4.辅助实体类
(1)说明
在实体类中使用注解@Data等来自lombok-1.18.24.jar。
(2)TaskDto
@Data @Builder @AllArgsConstructor @NoArgsConstructor public class TaskDto implements Serializable { //赛事名称 private String eventName; //活动内容 private String content; }
(3)ResultDto
@Data @Builder @AllArgsConstructor @NoArgsConstructor public class ResultDto implements Serializable { //竞赛队伍 private String teamName; //比赛成绩 private String content; }