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


    记录:474

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

    版本:JDK 1.8。

    1.一个Java抽象类

    (1)说明

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

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

    (2)代码

    1. public abstract class SportContest {
    2. //赛事任务
    3. private TaskDto taskDto;
    4. //开场仪式
    5. public abstract String announceStart();
    6. //举行比赛
    7. public abstract ResultDto playGame();
    8. //颁奖仪式
    9. public abstract String announceEnd(ResultDto resultDto);
    10. //举行体育赛事
    11. public String holdSportGame() {
    12. String result01 = announceStart();
    13. ResultDto result02 = playGame();
    14. String result03 = announceEnd(result02);
    15. return result03;
    16. }
    17. public TaskDto getTaskDto() {
    18. return taskDto;
    19. }
    20. public void setTaskDto(TaskDto taskDto) {
    21. this.taskDto = taskDto;
    22. }
    23. }

    2.实现Java抽象类和抽象方法

    (1)实现类TableTennisContest

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

    (2)实现类SwimmingContest

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

    3.代理模式应用

    (1)说明

    其一,代理类也实现抽象类。

    其二,代理类的构造方法是有参构造方法,且传入的是抽象类。

    (2)代码

    1. public class HoldSportContestProxy extends SportContest {
    2. //实际举行的赛事实现类
    3. private SportContest sportContest;
    4. //传入实际举行的赛事实现类
    5. public HoldSportContestProxy(SportContest sportContest) {
    6. this.sportContest = sportContest;
    7. }
    8. @Override
    9. public String announceStart() {
    10. TaskDto var01 = this.sportContest.getTaskDto();
    11. System.out.println("【当前正在举行" + var01.getEventName() + "的开场仪式】");
    12. String var02 = this.sportContest.announceStart();
    13. return var02;
    14. }
    15. @Override
    16. public ResultDto playGame() {
    17. TaskDto var01 = this.sportContest.getTaskDto();
    18. System.out.println("【当前正在举行" + var01.getEventName() + "正赛】");
    19. ResultDto resultDto = this.sportContest.playGame();
    20. return resultDto;
    21. }
    22. @Override
    23. public String announceEnd(ResultDto resultDto) {
    24. TaskDto var01 = this.sportContest.getTaskDto();
    25. System.out.println("【当前正在举行" + var01.getEventName() + "的颁奖仪式】");
    26. String var02 = this.sportContest.announceEnd(resultDto);
    27. return var02;
    28. }
    29. }

    4.示例测试

    (1)说明

    执行每个抽象类的实现类时,都需创建一个代理类。

    (2)代码

    1. public class ApplyAbstract {
    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. HoldSportContestProxy hscProxy = new HoldSportContestProxy(sportContest);
    13. hscProxy.holdSportGame();
    14. }
    15. }

    (3)输出结果

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

    5.辅助实体类

    (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月13日

  • 相关阅读:
    在新的服务器上成功安装mysqlclient的方法【解决No matching distribution found for mysqlclient的问题】
    LitePal在Kotlin中使用的一个小问题
    java计算机毕业设计-酒店管理系统-源码+mysql数据库+系统+lw文档+部署
    2023年8月京东户外鞋服市场(京东数据运营)
    金仓数据库KingbaseES数据库开发指南(6. 业务系统开发建议)
    用 WifiManager 代码连接热点的一些坑
    一文搞懂Linux内存映射实现(二)
    #案例:演示鼠标api!#演示:鼠标单击#演示:鼠标双击#演示:鼠标拖拽#演示:鼠标悬停!
    【第34篇】MPViT:用于密集预测的多路径视觉转换器
    Python 算法交易实验41 GMM简单估计
  • 原文地址:https://blog.csdn.net/zhangbeizhen18/article/details/132866910