接着上一篇文章,上一篇讲了访问者模式的技术要领(暂且这么说好了),这一篇文章就来说说什么时候比较适合使用访问者模式,
统计功能:实现这个功能可以照样使用上一篇实现的工作,只需要在访问者上进行一些修改。
这里模拟的是计算所有同学的平均分:
public interface IVisitor {
public void visit(Fstudent fs);
public void visit(Mstudent ms);
public int averageScore();
}
public class Visitor implements IVisitor {
private int totalScore;
private int count;
@Override
public void visit(Fstudent fs) {
String info ="姓名:"+fs.getName();
info += "性别:"+(fs.getSex()==0?"男":"女");
info += "分数" +fs.getScore();
info += fs.otherinfos();
System.out.println(info);
this.totalScore += fs.getScore();
count++;
}
@Override
public void visit(Mstudent fs) {
String info ="姓名:"+fs.getName();
info += "性别:"+(fs.getSex()==0?"男":"女");
info += "分数" +fs.getScore();
info += fs.otherinfos();
System.out.println(info);
this.totalScore += fs.getScore();
count++;
}
@Override
public int averageScore() {
return this.totalScore/this.count;
}
}
public class test {
public static void main(String[] args) {
List<Student> ls = new ArrayList<Student>();
Student s = new Mstudent();
s.setName("张三");
s.setScore(60);
s.setSex(0);
ls.add(s);
Student ss = new Fstudent();
ss.setName("小花");
ss.setScore(90);
ss.setSex(1);
ls.add(ss);
Visitor vs = new Visitor();
for (Student t:ls) {
t.accept(vs);;
}
System.out.println("平均分:"+vs.averageScore());
}
}
大家可以去对比我上一篇的实现,尽管我们的要求变了,但是我们没有对我们的student做什么改变,只是在visitor中添加了一个方法,还有一些辅助的数据,这里我们可以很明显的看到访问者模式的有点,将数据(student)和操作完全的分开了。
多个访问者:之前我们的访问者模式都只有一个访问者,下面来看看多个访问者的情况。
public interface IVisitor {
public void visit(Fstudent fs);
public void visit(Mstudent ms);
}
public class AVisitor implements AverageVisitor {
private int totalScore;
private int count;
@Override
public void visit(Fstudent fs) {
// TODO Auto-generated method stub
this.totalScore += fs.getScore();
count++;
}
@Override
public void visit(Mstudent ms) {
// TODO Auto-generated method stub
this.totalScore += ms.getScore();
count++;
}
@Override
public void averageScore() {
// TODO Auto-generated method stub
System.out.println(this.totalScore/this.count);
}
}
public class RVisitor implements report {
String info="";
@Override
public void visit(Fstudent fs) {
// TODO Auto-generated method stub
info +="姓名:"+fs.getName();
info += "性别:"+(fs.getSex()==0?"男":"女");
info += "分数" +fs.getScore();
info += fs.otherinfos();
}
@Override
public void visit(Mstudent ms) {
// TODO Auto-generated method stub
info +="姓名:"+ms.getName();
info += "性别:"+(ms.getSex()==0?"男":"女");
info += "分数" +ms.getScore();
info += ms.otherinfos();
}
@Override
public void reportInfo() {
// TODO Auto-generated method stub
System.out.println(this.info);
}
}
public class test {
public static void main(String[] args) {
List<Student> ls = new ArrayList<Student>();
Student s = new Mstudent();
s.setName("张三");
s.setScore(60);
s.setSex(0);
ls.add(s);
Student ss = new Fstudent();
ss.setName("小花");
ss.setScore(90);
ss.setSex(1);
ls.add(ss);
AVisitor vs = new AVisitor();
RVisitor ms = new RVisitor();
for (Student t:ls) {
t.accept(vs);
t.accept(ms);
}
vs.averageScore();
ms.reportInfo();
}
}
我们还是没有对实体类student及其子类做任何的改变,只是扩展了我们的访问者类,不同的访问者实现不同的功能。
最后还有一个访问者模式的功能是实现拦截器,不过我还不会就先不写了,今天先到这里!!!!