您的当前位置:首页正文

浅谈Java中的interface应用与面向接口编程

2024-11-17 来源:个人技术集锦

前言

场景: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;
}
显示全文