文章目录

  • 访问者模式
  • 访问者模式实战

访问者模式

在相同的数据结构下, 增加容易变化的业务访问逻辑, 为了增强扩展性, 将易变的访问逻辑进行解耦的一种设计模式.

访问者模式实战

模拟学校中, 有老师和学生, 也有家长和校长这两种数据访问的模式.
该设计模式的类图如下

抽象用户类 User

public abstract class User {// 姓名public String name;// 身份  学生: 重点班、普通班 |  老师:  特级教师、普通教师、实习教师public String identity;// 班级public String clazz;public User(String name, String identity, String clazz) {this.name = name;this.identity = identity;this.clazz = clazz;}// 核心访问方法public abstract void accept(Visitor visitor);
}

学生类

public class Student extends User {public Student(String name, String identity, String clazz) {super(name, identity, clazz);}public void accept(Visitor visitor) {visitor.visit(this);}// 排名public int ranking() {return (int) (Math.random() * 100);}
}

教师类

public class Teacher extends User {public Teacher(String name, String identity, String clazz) {super(name, identity, clazz);}// 重点方法public void accept(Visitor visitor) {visitor.visit(this);}// 升本率public double entranceRatio() {return BigDecimal.valueOf(Math.random() * 100).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();}
}

访问者接口

public interface Visitor {// 访问学生信息void visit(Student student);// 访问老师信息void visit(Teacher teacher);
}

家长类

public class Parent implements Visitor {private Logger logger = LoggerFactory.getLogger(Parent.class);@Overridepublic void visit(Student student) {// 家长看学生的排名logger.info("学生信息  姓名: {} 班级:{}, 排名:{}", student.name, student.clazz, student.ranking());}@Overridepublic void visit(Teacher teacher) {logger.info("老师信息 姓名:{} 班级:{} 级别:{}", teacher.name, teacher.clazz, teacher.identity);}
}

校长类

public class Principal implements Visitor {private Logger logger = LoggerFactory.getLogger(Principal.class);@Overridepublic void visit(Student student) {logger.info("学生信息 姓名:{} 班级:{}", student.name, student.clazz);}@Overridepublic void visit(Teacher teacher) {// 校长看老师的升学率logger.info("老师信息 姓名:{} 班级:{} 升学率:{}", teacher.name, teacher.clazz, teacher.entranceRatio());}
}

数据看板类

public class DataView {List<User> userList = new ArrayList<>();public DataView() {userList.add(new Student("谢飞机", "重点班", "一年一班"));userList.add(new Student("windy", "重点班", "一年一班"));userList.add(new Student("大毛", "普通班", "二年三班"));userList.add(new Student("Shing", "普通班", "三年四班"));userList.add(new Teacher("BK", "特级教师", "一年一班"));userList.add(new Teacher("娜娜Goddess", "特级教师", "一年一班"));userList.add(new Teacher("dangdang", "普通教师", "二年三班"));userList.add(new Teacher("泽东", "实习教师", "三年四班"));}// 展示public void show(Visitor visitor) {for (User user : userList) {user.accept(visitor);}}}

测试类

public class ApiTest {private Logger logger = LoggerFactory.getLogger(ApiTest.class);@Testpublic void test() {DataView dataView = new DataView();logger.info(" 家长视角:  ");dataView.show(new Parent());logger.info("校长视角:  ");dataView.show(new Principal());}
}

测试结果如下

15:55:30.023 [main] INFO  com.thc.test.ApiTest -  家长视角:
15:55:30.031 [main] INFO  com.thc.design.visitor.impl.Parent - 学生信息  姓名: 谢飞机 班级:一年一班, 排名:16
15:55:30.031 [main] INFO  com.thc.design.visitor.impl.Parent - 学生信息  姓名: windy 班级:一年一班, 排名:4
15:55:30.031 [main] INFO  com.thc.design.visitor.impl.Parent - 学生信息  姓名: 大毛 班级:二年三班, 排名:36
15:55:30.031 [main] INFO  com.thc.design.visitor.impl.Parent - 学生信息  姓名: Shing 班级:三年四班, 排名:30
15:55:30.031 [main] INFO  com.thc.design.visitor.impl.Parent - 老师信息 姓名:BK 班级:一年一班 级别:特级教师
15:55:30.031 [main] INFO  com.thc.design.visitor.impl.Parent - 老师信息 姓名:娜娜Goddess 班级:一年一班 级别:特级教师
15:55:30.031 [main] INFO  com.thc.design.visitor.impl.Parent - 老师信息 姓名:dangdang 班级:二年三班 级别:普通教师
15:55:30.031 [main] INFO  com.thc.design.visitor.impl.Parent - 老师信息 姓名:泽东 班级:三年四班 级别:实习教师
15:55:30.031 [main] INFO  com.thc.test.ApiTest - 校长视角:
15:55:30.032 [main] INFO  c.thc.design.visitor.impl.Principal - 学生信息 姓名:谢飞机 班级:一年一班
15:55:30.033 [main] INFO  c.thc.design.visitor.impl.Principal - 学生信息 姓名:windy 班级:一年一班
15:55:30.033 [main] INFO  c.thc.design.visitor.impl.Principal - 学生信息 姓名:大毛 班级:二年三班
15:55:30.033 [main] INFO  c.thc.design.visitor.impl.Principal - 学生信息 姓名:Shing 班级:三年四班
15:55:30.036 [main] INFO  c.thc.design.visitor.impl.Principal - 老师信息 姓名:BK 班级:一年一班 升学率:81.75
15:55:30.036 [main] INFO  c.thc.design.visitor.impl.Principal - 老师信息 姓名:娜娜Goddess 班级:一年一班 升学率:71.87
15:55:30.036 [main] INFO  c.thc.design.visitor.impl.Principal - 老师信息 姓名:dangdang 班级:二年三班 升学率:41.04
15:55:30.036 [main] INFO  c.thc.design.visitor.impl.Principal - 老师信息 姓名:泽东 班级:三年四班 升学率:58.41

可以看到家长和校长虽然都打印的是学生和教师, 但家长可以看到学生的排名, 校长可以看到教师的升学率.

设计模式 访问者模式相关推荐

  1. 设计模式---访问者模式

    访问者模式 介绍 定义及使用场景 UML类图 角色 财务案例 个人心得体会 静态分派以及动态分派 静态分派 动态分派 访问者模式中的伪动态双分派 对访问者模式的一些思考 总结 优点 缺点 适用性 参考 ...

  2. C++设计模式——访问者模式(visitor pattern)

    一.原理讲解 1.1意图 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作. 1.2应用场景 一个对象结构包含很多类对象,它们有不同的接口,而你 ...

  3. java设计模式---访问者模式

      Java深入到一定程度,就不可避免的碰到设计模式这一概念,了解设计模式,将使自 己对java中的接口或抽象类应用有更深的理解.设计模式在java的中型系统中应用广 泛,遵循一定的编程模式,才能使自 ...

  4. yii2通过url访问类中的方法_行为型设计模式 访问者模式

    author zong email zongzhe1996@163.com 介绍 在访问者模式中,通过使用一个访问者类,可以改变元素类(被访问者)的执行算法.元素类的执行算法可以随着访问者的改变而改变 ...

  5. C++设计模式-访问者模式

    目录 基本概念 代码与实例 基本概念 访问者模式(Visitor):表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变元素的类的前提下定义作用于这些元素的新操作. UML图如下(此图来源于大 ...

  6. PHP设计模式——访问者模式

    声明:本系列博客参考资料<大话设计模式>,作者程杰. 访问者模式表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. UML类图: 角色 ...

  7. C#设计模式——访问者模式(Vistor Pattern)

    一.引言 在上一篇博文中分享了责任链模式,责任链模式主要应用在系统中的某些功能需要多个对象参与才能完成的场景.在这篇博文中,我将为大家分享我对访问者模式的理解. 二.访问者模式介绍 2.1 访问者模式 ...

  8. 大话设计模式—访问者模式

    在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法.通过这种方式,元素的执行算法可以随着访问者改变而改变.这种类型的设计模式属于行为型模式.根据模式,元 ...

  9. C++设计模式——访问者模式

    访问者模式 在GOF的<设计模式:可复用面向对象软件的基础>一书中对访问者模式是这样说的:表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的 ...

最新文章

  1. win7 64安装oracle10g 客户端,关于win7 64位 只 安装 oracle 10g的client
  2. Angualr6表单提交验证并跳转
  3. ionic ajax 跨域,解决 ionic 中的 CORS(跨域) 问题
  4. IE这回在css flex中扳回一局?
  5. LeetCode-Add Binary
  6. 基于Web用户控件的Portal
  7. python迭代器好处_关于Python中迭代器的作用
  8. Java生鲜电商平台-用户管理的架构与实战
  9. java编程彩球滑梯作弊_课内资源 - 基于C++的学生成绩管理系统
  10. PCA主成分分析实战和可视化 | 附R代码和测试数据
  11. event.keyCode列表
  12. J-LINK 操作使用指南
  13. 32位汇编寄存器含义解释
  14. OpenCV之线性混合操作
  15. 两年经验,尽然斩获多家巨头offer,如:蚂蚁、头条、PingCAP~
  16. 第七次全国人口普查,数据来了!
  17. 微商的十种实用推广方法
  18. 分享咖啡基础知识——从咖啡小白到咖啡发烧友需要了解的那些事儿!
  19. 25行代码爬取英雄联盟手游英雄皮肤图片
  20. 微信小程序输入框字数限制以及计算

热门文章

  1. [洛谷 P1647]锁 --- 规律 + 二进制
  2. Mysql的远程连接设置
  3. 【华为OD机试真题 python】羊、狼、农夫过河【2022 Q4 | 100分】
  4. java程序 购物车_用java代码写一个简单的网上购物车程序
  5. Mysql存储过程名规则_数据库对象命名规范一(原则、命名、 表、视图、存储过程、函数、触发器命名规范)...
  6. OS及Mac开源项目和学习资料【超级全面】
  7. 共探人工智能新发展,AICON 2022即将重磅开启
  8. linux系统下以存储从大到小并以K,M,G为单位的方式查看当前目录下的文件信息
  9. 怎么把PPT压缩到最小?
  10. Win系统 - Windows下的沙盒运行模式,竟然这么有用?!