java设计模式之访问者模式二

接着上一篇文章,上一篇讲了访问者模式的技术要领(暂且这么说好了),这一篇文章就来说说什么时候比较适合使用访问者模式,

统计功能:实现这个功能可以照样使用上一篇实现的工作,只需要在访问者上进行一些修改。

这里模拟的是计算所有同学的平均分:

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及其子类做任何的改变,只是扩展了我们的访问者类,不同的访问者实现不同的功能。

最后还有一个访问者模式的功能是实现拦截器,不过我还不会就先不写了,今天先到这里!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值