接着上一篇文章,上一篇讲了访问者模式的技术要领(暂且这么说好了),这一篇文章就来说说什么时候比较适合使用访问者模式,
统计功能:实现这个功能可以照样使用上一篇实现的工作,只需要在访问者上进行一些修改。
这里模拟的是计算所有同学的平均分:
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()); } }
多个访问者:之前我们的访问者模式都只有一个访问者,下面来看看多个访问者的情况。
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(); } }
最后还有一个访问者模式的功能是实现拦截器,不过我还不会就先不写了,今天先到这里!!!!