设计模式初探-访问者模式(二)

2014-11-24 02:35:57 · 作者: · 浏览: 1
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、破坏封装。访问者模式常常迫使用户提供访问元素内部状态的公共操作,这可能破坏元素的封装性。