设计模式-访问者模式
2021/10/6 23:12:02
本文主要是介绍设计模式-访问者模式,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
文章目录
- 访问者模式
- 元素
- 元素实现1-数学
- 元素实现2-英语
- 访问者
- 访问者实现1-班主任
- 访问者实现2-英语老师
- 访问者实现3-数学老师
- 对象结构
- 测试类
- 总结
访问者模式
- 适合元素固定,对于元素的访问有变动的情况
元素
这里以考试科目作为元素
public interface Course { //接受老师访问者 public void accept(TeacherView view); }
元素实现1-数学
public class MathCourse implements Course { int score; public MathCourse() { Random random = new Random(); score = random.nextInt(100); } //这里有反转,把自己交给具体的访问者去处理 @Override public void accept(TeacherView teacherView) { teacherView.view(this); } public int getScore() { return score; } }
元素实现2-英语
public class EnglishCourse implements Course { int score; public EnglishCourse() { Random random = new Random(); score = random.nextInt(100); } @Override public void accept(TeacherView teacherView) { teacherView.view(this); } public int getScore() { return score; } }
访问者
public interface TeacherView { /** * 访问英语 * @param course */ void view(EnglishCourse course); /** * 访问数学 * @param course */ void view(MathCourse course); }
访问者实现1-班主任
public class ChargeTeacher implements TeacherView { List<Integer> englist = new ArrayList<>(); List<Integer> mathlist = new ArrayList<>(); @Override public void view(EnglishCourse course) { englist.add(course.getScore()); System.out.println("当前人数的数学平均分" + englist.stream().mapToDouble(x -> x.longValue()).average().orElse(0D)); } @Override public void view(MathCourse course) { mathlist.add(course.getScore()); System.out.println("当前人数的英语平均分" + mathlist.stream().mapToDouble(x -> x.longValue()).average().orElse(0D)); } }
访问者实现2-英语老师
public class EnglishTeacher implements TeacherView { @Override public void view(EnglishCourse course) { System.out.println("英语成绩:" + course.getScore()); } @Override public void view(MathCourse course) { } }
访问者实现3-数学老师
public class MathTeacher implements TeacherView { @Override public void view(EnglishCourse course) { } @Override public void view(MathCourse course) { System.out.println("数学成绩:" + course.getScore()); } }
对象结构
public class ScoreReport { List<Course> list = new ArrayList<>(); public ScoreReport() { list.add(new EnglishCourse()); list.add(new EnglishCourse()); list.add(new MathCourse()); list.add(new MathCourse()); } public void report(TeacherView teacherView) { for (Course course : list) { course.accept(teacherView); } } }
测试类
public class TestMain { public static void main(String[] args) { ScoreReport scoreReport = new ScoreReport(); // 数学老师访问成绩 scoreReport.report(new MathTeacher()); // 英语老师访问成绩 scoreReport.report(new EnglishTeacher()); // 班主任访问成成绩 scoreReport.report(new ChargeTeacher()); } } 数学成绩:44 数学成绩:84 英语成绩:71 英语成绩:10 当前人数的数学平均分71.0 当前人数的数学平均分40.5 当前人数的英语平均分44.0 当前人数的英语平均分64.0
总结
- 从结论来看,对于所有的元素而言,会根据访问者不同作出不同的反应,例始非班主任只会查看当科的分数,班主任会查看科目的平均数
- 扩展性强,可以方便的新增访问都,对之前的没有影响
这篇关于设计模式-访问者模式的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南