设计模式-访问者模式
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-10-06小米11i印度快充版ROM合集:极致体验,超越期待
- 2024-10-06【ROM下载】小米11i 5G 印度版系统, 疾速跃迁,定义新速度
- 2024-10-06【ROM下载】小米 11 青春活力版,青春无极限,活力全开
- 2024-10-05小米13T Pro系统合集:性能与摄影的极致融合,值得你升级的系统ROM
- 2024-10-01基于Python+Vue开发的医院门诊预约挂号系统
- 2024-10-01基于Python+Vue开发的旅游景区管理系统
- 2024-10-01RestfulAPI入门指南:打造简单易懂的API接口
- 2024-10-01初学者指南:了解和使用Server Action
- 2024-10-01Server Component入门指南:搭建与配置详解
- 2024-10-01React 中使用 useRequest 实现数据请求