Java的abstract应用和代理模式应用

记录:474

场景:Java的abstract应用,一个抽象类,多个实现类。Java代理模式应用,使用代理模式执行具体实现类,在代理类中做日志等记录。

版本:JDK 1.8。

1.一个Java抽象类

(1)说明

使用Java关键字abstract修饰的类,就是抽象类。

使用Java关键字abstract修饰的方法,就是抽象方法。抽象方法没有方法体。

(2)代码

java 复制代码
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

java 复制代码
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

java 复制代码
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)代码

java 复制代码
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)代码

java 复制代码
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)输出结果

java 复制代码
*******************************
【当前正在举行乒乓球比赛的开场仪式】
举行乒乓球比赛入场仪式:
步骤一: 乒乓球比赛队员入场.
步骤二: 裁判员、教练员等各就各位.
【当前正在举行乒乓球比赛正赛】
举行乒乓球比赛: 男单决赛,选手们在奋力搏击.
【当前正在举行乒乓球比赛的颁奖仪式】
举行颁奖仪式: 
步骤一: 为中国乒乓球队男单决赛冠军颁发金牌.
步骤二: 升中华人民共和国国旗,奏中华人民共和国国歌.
*******************************
【当前正在举行游泳比赛的开场仪式】
举行游泳比赛入场仪式:
步骤一: 游泳比赛队员入场.
步骤二: 裁判员、教练员等各就各位.
【当前正在举行游泳比赛正赛】
举行游泳比赛: 女子200米决赛,姑娘们在冲刺记录.
【当前正在举行游泳比赛的颁奖仪式】
举行颁奖仪式: 
步骤一: 为中国游泳队女子组200米决赛冠军颁发金牌.
步骤二: 升中华人民共和国国旗,奏中华人民共和国国歌.
*******************************

5.辅助实体类

(1)说明

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

(2)TaskDto

java 复制代码
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class TaskDto implements Serializable {
    //赛事名称
    private String eventName;
    //活动内容
    private String content;
}

(3)ResultDto

java 复制代码
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ResultDto implements Serializable {
    //竞赛队伍
    private String teamName;
    //比赛成绩
    private String content;
}

以上,感谢。

2023年9月13日

相关推荐
摇滚侠9 小时前
macbook shell 客户端推荐 Electerm macbook 版本下载链接
java·开发语言
程序员布吉岛9 小时前
Java 后端定时任务怎么选:@Scheduled、Quartz 还是 XXL-Job?(对比 + 避坑 + 选型)
java·开发语言
知无不研9 小时前
lambda表达式的原理和由来
java·开发语言·c++·lambda表达式
逍遥德9 小时前
Sring事务详解之02.如何使用编程式事务?
java·服务器·数据库·后端·sql·spring
笨蛋不要掉眼泪9 小时前
Redis哨兵机制全解析:原理、配置与实战故障转移演示
java·数据库·redis·缓存·bootstrap
Coder_Boy_9 小时前
基于SpringAI的在线考试系统-整体架构优化设计方案
java·数据库·人工智能·spring boot·架构·ddd
草履虫建模15 小时前
力扣算法 1768. 交替合并字符串
java·开发语言·算法·leetcode·职场和发展·idea·基础
qq_2975746718 小时前
【实战教程】SpringBoot 实现多文件批量下载并打包为 ZIP 压缩包
java·spring boot·后端
老毛肚18 小时前
MyBatis插件原理及Spring集成
java·spring·mybatis
学嵌入式的小杨同学18 小时前
【Linux 封神之路】信号编程全解析:从信号基础到 MP3 播放器实战(含核心 API 与避坑指南)
java·linux·c语言·开发语言·vscode·vim·ux