1.访问者模式简介
访问者模式(Visitor Pattern)模式是行为型(Behavioral)设计模式,提供一个作用于某种对象结构上的各元素的操作方式,可以使我们在不改变元素结构的前提下,定义作用于元素的新操作。
换言之,如果系统的数据结构是比较稳定的,但其操作(算法)是易于变化的,那么使用访问者模式是个不错的选择;如果数据结构是易于变化的,则不适合使用访问者模式。
访问者模式一共有五种角色:
(1) Vistor(抽象访问者):为该对象结构中具体元素角色声明一个访问操作接口。
(2) ConcreteVisitor(具体访问者):每个具体访问者都实现了Vistor中定义的操作。
(3) Element(抽象元素):定义了一个accept操作,以Visitor作为参数。
(4) ConcreteElement(具体元素):实现了Element中的accept()方法,调用Vistor的访问方法以便完成对一个元素的操作。
(5) ObjectStructure(对象结构):可以是组合模式,也可以是集合;能够枚举它包含的元素;提供一个接口,允许Vistor访问它的元素。
访问者模式举例
如果老师教学反馈得分大于等于85分、学生成绩大于等于90分,则可以入选成绩优秀奖;如果老师论文数目大于8、学生论文数目大于2,则可以入选科研优秀奖。
在这个例子中,老师和学生就是Element,他们的数据结构稳定不变。从上面的描述中,我们发现,对数据结构的操作是多变的,一会儿评选成绩,一会儿评选科研,这样就适合使用访问者模式来分离数据结构和操作。
式来分离数据结构和操作。
序号 | 类名 | 角色 | 说明 |
---|---|---|---|
1 | Visitor | Visitor | 抽象访问者 |
2 | GradeSelection | ConcreteVisitor | 具体访问者 |
3 | ResearcherSelection | ConcreteVisitor | 具体访问者 |
4 | Element | Element | 抽象元素 |
5 | Teacher | ConcreteElement | 具体元素 |
6 | Student | ConcreteElement | 具体元素 |
7 | ObjectStructure | ObjectStructure | 对象结构 |
8 | VisitorClient | 客户端 | 演示调用 |
举例的类图如下: