记录:474
场景:Java的abstract应用,一个抽象类,多个实现类。Java代理模式应用,使用代理模式执行具体实现类,在代理类中做日志等记录。
版本:JDK 1.8。
1.一个Java抽象类
(1)说明
使用Java关键字abstract修饰的类,就是抽象类。
使用Java关键字abstract修饰的方法,就是抽象方法。抽象方法没有方法体。
(2)代码
- public abstract class SportContest {
- //赛事任务
- private TaskDto taskDto;
- //开场仪式
- public abstract String announceStart();
- //举行比赛
- public abstract ResultDto playGame();
- //颁奖仪式
- public abstract String announceEnd(ResultDto resultDto);
- //举行体育赛事
- public String holdSportGame() {
- String result01 = announceStart();
- ResultDto result02 = playGame();
- String result03 = announceEnd(result02);
- return result03;
- }
- public TaskDto getTaskDto() {
- return taskDto;
- }
- public void setTaskDto(TaskDto taskDto) {
- this.taskDto = taskDto;
- }
- }
2.实现Java抽象类和抽象方法
(1)实现类TableTennisContest
- public class TableTennisContest extends SportContest {
- 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 "乒乓球比赛圆满结束";
- }
- }
(2)实现类SwimmingContest
- public class SwimmingContest extends SportContest {
- 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 "游泳比赛圆满结束";
- }
- }
3.代理模式应用
(1)说明
其一,代理类也实现抽象类。
其二,代理类的构造方法是有参构造方法,且传入的是抽象类。
(2)代码
- public class HoldSportContestProxy extends SportContest {
- //实际举行的赛事实现类
- private SportContest sportContest;
- //传入实际举行的赛事实现类
- public HoldSportContestProxy(SportContest sportContest) {
- this.sportContest = sportContest;
- }
- @Override
- public String announceStart() {
- TaskDto var01 = this.sportContest.getTaskDto();
- System.out.println("【当前正在举行" + var01.getEventName() + "的开场仪式】");
- String var02 = this.sportContest.announceStart();
- return var02;
- }
- @Override
- public ResultDto playGame() {
- TaskDto var01 = this.sportContest.getTaskDto();
- System.out.println("【当前正在举行" + var01.getEventName() + "正赛】");
- ResultDto resultDto = this.sportContest.playGame();
- return resultDto;
- }
- @Override
- public String announceEnd(ResultDto resultDto) {
- TaskDto var01 = this.sportContest.getTaskDto();
- System.out.println("【当前正在举行" + var01.getEventName() + "的颁奖仪式】");
- String var02 = this.sportContest.announceEnd(resultDto);
- return var02;
- }
- }
4.示例测试
(1)说明
执行每个抽象类的实现类时,都需创建一个代理类。
(2)代码
- public class ApplyAbstract {
- // 主函数入口
- 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) {
- HoldSportContestProxy hscProxy = new HoldSportContestProxy(sportContest);
- hscProxy.holdSportGame();
- }
- }
(3)输出结果
- *******************************
- 【当前正在举行乒乓球比赛的开场仪式】
- 举行乒乓球比赛入场仪式:
- 步骤一: 乒乓球比赛队员入场.
- 步骤二: 裁判员、教练员等各就各位.
- 【当前正在举行乒乓球比赛正赛】
- 举行乒乓球比赛: 男单决赛,选手们在奋力搏击.
- 【当前正在举行乒乓球比赛的颁奖仪式】
- 举行颁奖仪式:
- 步骤一: 为中国乒乓球队男单决赛冠军颁发金牌.
- 步骤二: 升中华人民共和国国旗,奏中华人民共和国国歌.
- *******************************
- 【当前正在举行游泳比赛的开场仪式】
- 举行游泳比赛入场仪式:
- 步骤一: 游泳比赛队员入场.
- 步骤二: 裁判员、教练员等各就各位.
- 【当前正在举行游泳比赛正赛】
- 举行游泳比赛: 女子200米决赛,姑娘们在冲刺记录.
- 【当前正在举行游泳比赛的颁奖仪式】
- 举行颁奖仪式:
- 步骤一: 为中国游泳队女子组200米决赛冠军颁发金牌.
- 步骤二: 升中华人民共和国国旗,奏中华人民共和国国歌.
- *******************************
5.辅助实体类
(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;
- }
以上,感谢。
2023年9月13日