s AwardCheck{
@Override
public void visit(Teacher teacher) {
String result = teacher.getPaperCount()>10 "恭喜获取科研奖":"很遗憾未获取科研奖";
System.out.println("教师:"+teacher.getName()+",发表论文数:"+teacher.getPaperCount()+","+result);
}
@Override
public void visit(Student student) {
String result = student.getPaperCount()>2 "恭喜获取科研奖":"很遗憾未获取科研奖";
System.out.println("学生:"+student.getName()+",发表论文数:"+student.getPaperCount()+","+result);
}
}
/**
* 具体访问者:优秀成绩奖审批
*/
class OutstandingAchievementAward implements AwardCheck{
@Override
public void visit(Teacher teacher) {
String result = teacher.getFeedBackScore()>=90 "恭喜获取优秀成绩奖":"很遗憾未获取优秀成绩奖";
System.out.println("教师:"+teacher.getName()+",教学反馈分数:"+teacher.getFeedBackScore()+","+result);
}
@Override
public void visit(Student student) {
String result = student.getAverageScore()>=90 "恭喜获取优秀成绩奖":"很遗憾未获取优秀成绩奖";
System.out.println("学生:"+student.getName()+",学科平均分数:"+student.getAverageScore()+","+result);
}
}
/**
* 对象结构:员工集合类
*/
class StaffList{
private List
staffs = new ArrayList
(); public void addStaff(Staff staff){ staffs.add(staff); } /** * 遍历员工集合中每个员工对象,完成奖项审批 */ public void accept(AwardCheck handler){ for(Staff staff : staffs){ staff.accept(handler); } } }
运行结果:
=========评选科研奖===============
教师:张三,发表论文数:12,恭喜获取科研奖
教师:李四,发表论文数:8,很遗憾未获取科研奖
学生:王五,发表论文数:0,很遗憾未获取科研奖
学生:赵六,发表论文数:3,恭喜获取科研奖
=========评选优秀成绩奖===========
教师:张三,教学反馈分数:95,恭喜获取优秀成绩奖
教师:李四,教学反馈分数:85,很遗憾未获取优秀成绩奖
学生:王五,学科平均分数:80,很遗憾未获取优秀成绩奖
学生:赵六,学科平均分数:93,恭喜获取优秀成绩奖
四、模式优缺点
优点:
1、访问者模式使得易于增加新的操作。仅需增加一个新的访问者即可在一个对象结构上定义一个新的操作。
2、访问者集中相关的操作而分离无关的操作。相关的行为集中在一个访问者中,无关的行为被分散到各自的访问者子类中。
3、让用户可以在不改变现有类层次结构的情况下,定义作用于该层次结构的操作。
4、累计状态。当访问者访问对象结构中的每一个元素时,可以积累状态,否则需要将状态作为额外的参数传递给进行遍历的操作,或定义为全局变量。
缺点:
1、增加新的ConcreteElement类很困难。增加新的元素类需要在Visitor中添加新的抽象操作,并在每一个ConcreteVisitor类中实现相应的操作,违背“开闭原则”。
2、破坏封装。访问者模式常常迫使用户提供访问元素内部状态的公共操作,这可能破坏元素的封装性。