访问者模式是行为性模式的一种,可以方便我们遍历不同的类型,执行不同的操作,下面要演示的程序循环打印学生的信息
public abstract class Student { /** * 考试分数 */ private int score; private String name; private int sex; public int getScore() { return score; } public void setScore(int score) { this.score = score; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getSex() { return sex; } public void setSex(int sex) { this.sex = sex; } public void prints(){ String info ="姓名:"+this.name; info += "性别:"+(this.sex==0?"男":"女"); info += "分数" +this.score; info += this.otherinfos(); System.out.println(info); } protected abstract String otherinfos(); }
public class Mstudent extends Student { /** * 男同学 */ @Override protected String otherinfos() { // TODO Auto-generated method stub return "家庭住址"; } }
public class Fstudent extends Student { /** * 女同学 */ @Override protected String otherinfos() { // TODO Auto-generated method stub return "家庭住址"; } }
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); for (Student t:ls) { t.prints(); } } }
姓名:张三性别:男分数60家庭住址 姓名:小花性别:女分数90家庭住址
public abstract class Student { /** * 考试分数 */ private int score; private String name; private int sex; public int getScore() { return score; } public void setScore(int score) { this.score = score; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getSex() { return sex; } public void setSex(int sex) { this.sex = sex; } /* public void prints(){ String info ="姓名:"+this.name; info += "性别:"+(this.sex==0?"男":"女"); info += "分数" +this.score; info += this.otherinfos(); System.out.println(info); }*/ public abstract void accept(IVisitor v); protected abstract String otherinfos(); }
public class Fstudent extends Student { /** * 女同学 */ @Override protected String otherinfos() { // TODO Auto-generated method stub return "家庭住址"; } @Override public void accept(IVisitor v) { // TODO Auto-generated method stub v.visit(this); } }
public class Mstudent extends Student { /** * 男同学 */ @Override protected String otherinfos() { // TODO Auto-generated method stub return "家庭住址"; } @Override public void accept(IVisitor v) { // TODO Auto-generated method stub v.visit(this); } }
public interface IVisitor { public void visit(Fstudent fs); public void visit(Mstudent ms); }
public class Visitor implements IVisitor { @Override public void visit(Fstudent fs) { String info ="姓名:"+fs.getName(); info += "性别:"+(fs.getSex()==0?"男":"女"); info += "分数" +fs.getScore(); info += fs.otherinfos(); System.out.println(info); } @Override public void visit(Mstudent fs) { String info ="姓名:"+fs.getName(); info += "性别:"+(fs.getSex()==0?"男":"女"); info += "分数" +fs.getScore(); info += fs.otherinfos(); System.out.println(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); for (Student t:ls) { t.accept(new Visitor());; } } }