访问者模式
表示一个作用于某对象结构中的各个元素的操作。它使你可以在不改变各个元素的类的前提下定义作用于这些元素的新操作
一 、 概述
当一个集合中有若干个对象时,习惯上将这些对象称作集合中的元素,访问者模式可以使得我们在不改变集合中各个元素的类的前提下定义作用于这些元素上的新操作。二、访问者模式的结构与使用
模式的结构中包括五种角色:
模式的结构的描述与使用
1.抽象元素(Element): Student.java
public abstractclass Student{
public abstract void accept(Visitor v);
}
2.具体元素(Concrete Element)_1: Undergraduate.java
public classUndergraduate extends Student{
double math,english; //成绩
String name;
Undergraduate(String name,doublemath,doubleenglish){
this.name=name;
this.math=math;
this.english=english;
}
public double getMath(){
returnmath;
}
public double getEnglish(){
return english;
}
public String getName(){
returnname;
}
public voidaccept(Visitor v){
v.visit(this);
}
}
2.具体元素(Concrete Element)_2:GraduateStudent.java
public class GraduateStudent extends Student{
double math,english,physics; //成绩
String name;
GraduateStudent(String name,doublemath,doubleenglish,double physics){
this.name=name;
this.math=math;
this.english=english;
this.physics=physics;
}
public double getMath(){
returnmath;
}
public double getEnglish(){
return english;
}
public double getPhysics(){
returnphysics;
}
public String getName(){
returnname;
}
public voidaccept(Visitor v){
v.visit(this);
}
}
3.对象结构(Object Structure)
本问题中,我们让该角色是 java.util 包中的 ArrayList 集合4.抽象访问者(Visitor): Visitor.java
public interface Visitor{
public void visit(Undergraduate stu);
public void visit(GraduateStudentstu);
}
5.具体访问者( Concrete Visitor): Company.java
public class Company implements Visitor{
public void visit(Undergraduate stu){
double math=stu.getMath();
double english=stu.getEnglish();
if(math>80&&english>90)
System.out.println(stu.getName()+"被录用");
}
public void visit(GraduateStudentstu){
double math=stu.getMath();
double english=stu.getEnglish();
double physics=stu.getPhysics();
if(math>80&&english>90&&physics>70)
System.out.println(stu.getName()+"被录用");
}
}
6.应用: Application.java
import java.util.*;
public classApplication{
public static void main(String args[]) {
Visitor visitor=new Company();
ArrayList<Student> studentList=new ArrayList<Student>();
Student student=null;
studentList.add(student=newUndergraduate("张三",67,88));
studentList.add(student=newUndergraduate("李四",90,98));
studentList.add(student=newUndergraduate("将粼粼",85,92));
studentList.add(student=new GraduateStudent("刘名",88,70,87));
studentList.add(student=new GraduateStudent("郝人",90,95,82));
Iterator<Student> iter=studentList.iterator();
while(iter.hasNext()){
Student stu=iter.next();
stu.accept(visitor);
}
}
}
三、访问者模式的优点