• Java的interface应用和面向接口编程


    记录:477

    场景:Java的关键字interface应用,一个接口,多个实现类。面向接口编程,把业务逻辑线提取出来作为接口,具体的业务实现通过该接口的实现类来完成。

    版本:JDK 1.8。

    1.一个Java接口

    (1)说明

    使用Java关键字interface修饰的类型,就是接口。

    接口里面方法一般没有函数体,实际就是抽象方法。

    比如:String announceStart();

    接口里面方法有函数体情况,一般使用default关键字修饰。

    比如:default String holdSportGame() { ...}

    (2)代码

    1. public interface SportContest {
    2. //开场仪式
    3. String announceStart();
    4. //举行比赛
    5. ResultDto playGame();
    6. //颁奖仪式
    7. String announceEnd(ResultDto resultDto);
    8. //举行体育赛事
    9. default String holdSportGame() {
    10. String result01 = announceStart();
    11. ResultDto result02 = playGame();
    12. String result03 = announceEnd(result02);
    13. return result03;
    14. }
    15. }

    2.多个实现类实现同一个Java接口

    实现Java接口使用implements关键字。

    (1)实现类TableTennisContest

    1. public class TableTennisContest implements SportContest {
    2. //赛事任务
    3. private TaskDto taskDto = null;
    4. public TableTennisContest(TaskDto taskDto) {
    5. this.setTaskDto(taskDto);
    6. }
    7. @Override
    8. public String announceStart() {
    9. TaskDto taskDto = this.getTaskDto();
    10. System.out.println("举行乒乓球比赛入场仪式:");
    11. System.out.println("步骤一: " + taskDto.getEventName() + "队员入场.");
    12. System.out.println("步骤二: 裁判员、教练员等各就各位.");
    13. return "乒乓球比赛进行中";
    14. }
    15. @Override
    16. public ResultDto playGame() {
    17. TaskDto taskDto = this.getTaskDto();
    18. System.out.println("举行乒乓球比赛: " + taskDto.getContent() + ",选手们在奋力搏击.");
    19. return ResultDto.builder().teamName("中国乒乓球队").content("女单决赛冠军").build();
    20. }
    21. @Override
    22. public String announceEnd(ResultDto resultDto) {
    23. System.out.println("举行颁奖仪式: ");
    24. System.out.println("步骤一: 为" + resultDto.getTeamName() + resultDto.getContent() + "颁发金牌.");
    25. System.out.println("步骤二: 升中华人民共和国国旗,奏中华人民共和国国歌.");
    26. return "乒乓球比赛圆满结束";
    27. }
    28. public TaskDto getTaskDto() {
    29. return this.taskDto;
    30. }
    31. public void setTaskDto(TaskDto taskDto) {
    32. this.taskDto = taskDto;
    33. }
    34. }

    (2)实现类SwimmingContest

    1. public class SwimmingContest implements SportContest {
    2. //赛事任务
    3. private TaskDto taskDto = null;
    4. public SwimmingContest(TaskDto taskDto) {
    5. this.setTaskDto(taskDto);
    6. }
    7. @Override
    8. public String announceStart() {
    9. TaskDto taskDto = this.getTaskDto();
    10. System.out.println("举行游泳比赛入场仪式:");
    11. System.out.println("步骤一: " + taskDto.getEventName() + "队员入场.");
    12. System.out.println("步骤二: 裁判员、教练员等各就各位.");
    13. return "游泳比赛进行中";
    14. }
    15. @Override
    16. public ResultDto playGame() {
    17. TaskDto taskDto = this.getTaskDto();
    18. System.out.println("举行游泳比赛: " + taskDto.getContent() + ",选手们在冲刺记录.");
    19. return ResultDto.builder().teamName("中国游泳队").content("男子组200米决赛冠军").build();
    20. }
    21. @Override
    22. public String announceEnd(ResultDto resultDto) {
    23. System.out.println("举行颁奖仪式: ");
    24. System.out.println("步骤一: 为" + resultDto.getTeamName() + resultDto.getContent() + "颁发金牌.");
    25. System.out.println("步骤二: 升中华人民共和国国旗,奏中华人民共和国国歌.");
    26. return "游泳比赛圆满结束";
    27. }
    28. public TaskDto getTaskDto() {
    29. return this.taskDto;
    30. }
    31. public void setTaskDto(TaskDto taskDto) {
    32. this.taskDto = taskDto;
    33. }
    34. }

    3.示例测试

    (1)说明

    执行接口函数时,需先创建接口实现类的实例对象。

    (2)代码

    1. public class ApplyInterface {
    2. // 主函数入口
    3. public static void main(String[] args) {
    4. System.out.println("*******************************");
    5. holdSportGame(new TableTennisContest(TaskDto.builder().eventName("乒乓球比赛").content("女单决赛").build()));
    6. System.out.println("*******************************");
    7. holdSportGame(new SwimmingContest(TaskDto.builder().eventName("游泳比赛").content("男子200米决赛").build()));
    8. System.out.println("*******************************");
    9. }
    10. // 面向接口编程
    11. public static void holdSportGame(SportContest sportContest) {
    12. sportContest.holdSportGame();
    13. }
    14. }

    (3)输出结果

    1. *******************************
    2. 举行乒乓球比赛入场仪式:
    3. 步骤一: 乒乓球比赛队员入场.
    4. 步骤二: 裁判员、教练员等各就各位.
    5. 举行乒乓球比赛: 女单决赛,选手们在奋力搏击.
    6. 举行颁奖仪式:
    7. 步骤一: 为中国乒乓球队女单决赛冠军颁发金牌.
    8. 步骤二: 升中华人民共和国国旗,奏中华人民共和国国歌.
    9. *******************************
    10. 举行游泳比赛入场仪式:
    11. 步骤一: 游泳比赛队员入场.
    12. 步骤二: 裁判员、教练员等各就各位.
    13. 举行游泳比赛: 男子200米决赛,选手们在冲刺记录.
    14. 举行颁奖仪式:
    15. 步骤一: 为中国游泳队男子组200米决赛冠军颁发金牌.
    16. 步骤二: 升中华人民共和国国旗,奏中华人民共和国国歌.
    17. *******************************

    4.辅助实体类

    (1)说明

    在实体类中使用注解@Data等来自lombok-1.18.24.jar。

    (2)TaskDto

    1. @Data
    2. @Builder
    3. @AllArgsConstructor
    4. @NoArgsConstructor
    5. public class TaskDto implements Serializable {
    6. //赛事名称
    7. private String eventName;
    8. //活动内容
    9. private String content;
    10. }

    (3)ResultDto

    1. @Data
    2. @Builder
    3. @AllArgsConstructor
    4. @NoArgsConstructor
    5. public class ResultDto implements Serializable {
    6. //竞赛队伍
    7. private String teamName;
    8. //比赛成绩
    9. private String content;
    10. }

    以上,感谢。

    2023年9月14日

  • 相关阅读:
    S7-1200PLC通过远程工具实现上传下载或修改PLC程序的具体方法
    如何应对数仓资源不足导致的核心任务延迟
    redis学习完整版
    ASP.NET Core如何禁用模型验证(或者从模型状态中移除某些属性)?
    edge下载网络问题无法下载
    shell脚本中的条件测试和条件语法
    电视家最新消息
    最适合运动的耳机类型是什么、最适合运动的耳机推荐
    添加驱动模块到内核的两种方法
    前端工程化(editorconfig+ESLint+Prettier+StyleLint+Husky、Commitlint)
  • 原文地址:https://blog.csdn.net/zhangbeizhen18/article/details/132892388