一、以校长访问为例:
abstract class Person {
private String name;
public Person(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class Teacher extends Person { // 教师
private String course;// 课程
private int amount;// 学时
public String getCourse() {
return course;
}
public void setCourse(String course) {
this.course = course;
}
public int getAmount() {
return amount;
}
public void setAmount(int amount) {
this.amount = amount;
}
public Teacher(String name,String course,int amount) {
super(name);
// TODO Auto-generated constructor stub
this.course = course;
this.amount = amount;
}
}
class Student extends Person {// 学生
private String course;// 课程
private int grade;// 成绩
public Student(String name, String course, int grade) {
super(name);
this.course = course;
this.grade = grade;
}
public String getCourse() {
return course;
}
public void setCourse(String course) {
this.course = course;
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
}
class PresidentVisitor {// 校长访问
public void visit(Person person) {
if (person instanceof Teacher) {
Teacher teacher = (Teacher) person;
System.out.println("校长 访问老师 " + teacher.getName() + "学时:" + teacher.getAmount());
} else if (person instanceof Student) {
Student student = (Student) person;
System.out.println("校长 访问学生 " + student.getName() + "课程:" + student.getCourse());
}
}
}
class DeanVisitor {// 院长访问
public void visit(Person person) {
if (person instanceof Teacher) {
Teacher teacher = (Teacher) person;
System.out.println("院长 访问老师 " + teacher.getName() + "课程:" + teacher.getCourse());
} else if (person instanceof Student) {
Student student = (Student) person;
System.out.println("院长 访问学生 " + student.getName() + "成绩:" + student.getGrade());
}
}
}
public class Visitors {
public static void main(String[] args) {
List<Person> listperson = new ArrayList<Person>();
Person t1 = new Teacher("张老师", "编译原理", 48);// 创建老师
Person t2 = new Teacher("王老师", "数据库", 54);
Student s1 = new Student("赵同学", "编译原理", 90);// 创建学生
Student s2 = new Student("刘同学", "数据库", 82);
listperson.add(t1);
listperson.add(t2);
listperson.add(s1);
listperson.add(s2);
PresidentVisitor pv = new PresidentVisitor();// 创建校长
for (Person b : listperson) {
pv.visit(b);
}
DeanVisitor dv = new DeanVisitor();// 创建院长
for (Person b : listperson) {
dv.visit(b);
}
}
}
改进:
//创建一个人员基类
abstract class Person {
private String name;
public Person(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
// 教师
class Teacher extends Person {
private String course;// 所教课程
private int amount;// 学时
public Teacher(String name, String course, int amount) {
super(name);
this.course = course;
this.amount = amount;
}
public String getCourse() {
return course;
}
public int getAmount() {
return amount;
}
}
// 学生
class Student extends Person {
private String course;// 所学课程
private int grade;// 成绩
public Student(String name, String course, int grade) {
super(name);
this.course = course;
this.grade = grade;
}
public String getCourse() {
return course;
}
public int getGrade() {
return grade;
}
}
interface Visitor {
void visit(Teacher teacher);
void visit(Student student);
}
class PresidentVisitor implements Visitor {// 校长访问
@Override
public void visit(Teacher teacher) {
// TODO Auto-generated method stub
System.out.println("校长 访问老师 " + teacher.getName() + "学时:" + teacher.getAmount());
}
@Override
public void visit(Student student) {
// TODO Auto-generated method stub
System.out.println("校长 访问学生 " + student.getName() + "课程:" + student.getCourse());
}
}
class DeanVisitor implements Visitor {// 院长访问
@Override
public void visit(Teacher teacher) {
// TODO Auto-generated method stub
System.out.println("院长 访问老师 " + teacher.getName() + "课程:" + teacher.getCourse());
}
@Override
public void visit(Student student) {
// TODO Auto-generated method stub
System.out.println("院长 访问学生 " + student.getName() + "成绩:" + student.getGrade());
}
}
public class Visitors {
public static void main(String[] args) {
List<Person> listperson = new ArrayList<Person>();
Person t1 = new Teacher("张老师", "编译原理", 48);// 创建老师
Person t2 = new Teacher("王老师", "数据库", 54);
Person s1 = new Student("赵同学", "编译原理", 90);// 创建学生
Person s2 = new Student("刘同学", "数据库", 82);
listperson.add(t1);
listperson.add(t2);
listperson.add(s1);
listperson.add(s2);
Visitor pv = new PresidentVisitor();// 创建校长
for (Person b : listperson) {
if (b instanceof Teacher) {
Teacher teacher = (Teacher) b;
pv.visit(teacher);
} else if (b instanceof Student) {
Student student = (Student) b;
pv.visit(student);
}
}
Visitor dv = new DeanVisitor();// 创建院长
for (Person b : listperson) {
if (b instanceof Teacher) {
Teacher teacher = (Teacher) b;
dv.visit(teacher);
} else if (b instanceof Student) {
Student student = (Student) b;
dv.visit(student);
}
}
}
}
继续改进:
//创建一个人员基类
abstract class Person {
private String name;
public Person(String name) {
super();
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract void accept(Visitor visitor);
}
// 教师
class Teacher extends Person {
private String course;// 所教课程
private int amount;// 学时
public Teacher(String name, String course, int amount) {
super(name);
this.course = course;
this.amount = amount;
}
public String getCourse() {
return course;
}
public int getAmount() {
return amount;
}
@Override
public void accept(Visitor visitor) {
// TODO Auto-generated method stub
visitor.visit(this);
}
}
// 学生
class Student extends Person {
private String course;// 所学课程
private int grade;// 成绩
public Student(String name, String course, int grade) {
super(name);
this.course = course;
this.grade = grade;
}
public String getCourse() {
return course;
}
public int getGrade() {
return grade;
}
@Override
public void accept(Visitor visitor) {
// TODO Auto-generated method stub
visitor.visit(this);
}
}
interface Visitor {
void visit(Teacher teacher);
void visit(Student student);
}
class PresidentVisitor implements Visitor {// 校长访问
@Override
public void visit(Teacher teacher) {
// TODO Auto-generated method stub
System.out.println("校长 访问老师 " + teacher.getName() + "学时:" + teacher.getAmount());
}
@Override
public void visit(Student student) {
// TODO Auto-generated method stub
System.out.println("校长 访问学生 " + student.getName() + "课程:" + student.getCourse());
}
}
class DeanVisitor implements Visitor {// 院长访问
@Override
public void visit(Teacher teacher) {
// TODO Auto-generated method stub
System.out.println("院长 访问老师 " + teacher.getName() + "课程:" + teacher.getCourse());
}
@Override
public void visit(Student student) {
// TODO Auto-generated method stub
System.out.println("院长 访问学生 " + student.getName() + "成绩:" + student.getGrade());
}
}
class ObjectList {
private List<Person> lists = new ArrayList<Person>();
public void Attach(Person element) {// 增加
lists.add(element);
}
public void Detach(Person element) {// 移除
lists.remove(element);
}
public void Display(Visitor visitor) {// 查看显示
for (Person element : lists) {
element.accept(visitor);
}
}
}
public class Visitors {
public static void main(String[] args) {
Person t1 = new Teacher("张老师", "编译原理", 48);// 创建老师
Person t2 = new Teacher("王老师", "数据库", 54);
Person s1 = new Student("赵同学", "编译原理", 90);// 创建学生
Person s2 = new Student("刘同学", "数据库", 82);
Visitor p = new PresidentVisitor();// 创建校长
Visitor d = new DeanVisitor();// 院长
ObjectList listperson = new ObjectList();
listperson.Attach(t1);
listperson.Attach(t2);
listperson.Attach(s1);
listperson.Attach(s2);
listperson.Display(p);
System.out.println("================");
listperson.Display(d);
}
}
二、访问者模式
访问者模式的目的是封装一些施加于某种数据结构元素之上的操作。一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变。
import java.util.ArrayList;
import java.util.List;
abstract class Visitor {
public abstract void VisitConcreteElementA(ConcreteElementA concreteElementA);
public abstract void VisitConcreteElementB(ConcreteElementB concreteElementB);
}
class ConcreteVisitor1 extends Visitor {
@Override
public void VisitConcreteElementA(ConcreteElementA concreteElementA) {
// TODO Auto-generated method stub
System.out.println(concreteElementA.getClass().getName() + "被" + this.getClass().getName() + "访问");
}
@Override
public void VisitConcreteElementB(ConcreteElementB concreteElementB) {
// TODO Auto-generated method stub
System.out.println(concreteElementB.getClass().getName() + "被" + this.getClass().getName() + "访问");
}
}
class ConcreteVisitor2 extends Visitor {
@Override
public void VisitConcreteElementA(ConcreteElementA concreteElementA) {
// TODO Auto-generated method stub
System.out.println(concreteElementA.getClass().getName() + "被" + this.getClass().getName() + "访问");
}
@Override
public void VisitConcreteElementB(ConcreteElementB concreteElementB) {
// TODO Auto-generated method stub
System.out.println(concreteElementB.getClass().getName() + "被" + this.getClass().getName() + "访问");
}
}
abstract class Element {
public abstract void Accept(Visitor visitor);
}
class ConcreteElementA extends Element {
public void Accept(Visitor visitor) {
visitor.VisitConcreteElementA(this);
}
public void OperationA() {
}
}
class ConcreteElementB extends Element {
public void Accept(Visitor visitor) {
visitor.VisitConcreteElementB(this);
}
public void OperationB() {
}
}
class ObjectStructure {
private List<Element> elements = new ArrayList<Element>();
public void Attach(Element element) {
elements.add(element);
}
public void Detach(Element element) {
elements.remove(element);
}
public void Accept(Visitor visitor) {
for (Element e : elements) {
e.Accept(visitor);
}
}
}
public class Visitors {
public static void main(String[] args) {
// TODO Auto-generated method stub
ObjectStructure o = new ObjectStructure();
o.Attach(new ConcreteElementA());
o.Attach(new ConcreteElementB());
ConcreteVisitor1 v1 = new ConcreteVisitor1();
ConcreteVisitor2 v2 = new ConcreteVisitor2();
o.Accept(v1);
o.Accept(v2);
}
}
三、以男人和女人为例:
abstract class Person {
protected String action;
public String getAction() {
return action;
}
public void setAction(String action) {
this.action = action;
}
// 得到结论或反应
public abstract void GetConclusion();
}
class Man extends Person {
public void GetConclusion() {
if (action == "成功") {
System.out.println("男人" + action + "时,背后多半有一个伟大的女人。");
} else if (action == "失败") {
System.out.println("男人" + action + "时,闷头喝酒,谁也不用劝。");
} else if (action == "恋爱") {
System.out.println("男人" + action + "时,凡事不懂也要装懂。");
}
}
}
class Woman extends Person {
public void GetConclusion() {
if (action == "成功") {
System.out.println("女人" + action + "时,背后多半有一个不成功的男人。");
} else if (action == "失败") {
System.out.println("女人" + action + "时,眼泪汪汪,谁也劝不了。");
} else if (action == "恋爱") {
System.out.println("女人" + action + "时,遇事懂也装作不懂。");
}
}
}
public class Visitors {
public static void main(String[] args) {
List<Person> persons = new ArrayList<Person>();
Person man1 = new Man();
man1.setAction("成功");
persons.add(man1);
Person woman1 = new Woman();
woman1.setAction("成功");
persons.add(woman1);
Person man2 = new Man();
man2.setAction("失败");
persons.add(man2);
Person woman2 = new Woman();
woman2.setAction("失败");
persons.add(woman2);
Person man3 = new Man();
man3.setAction("恋爱");
persons.add(man3);
Person woman3 = new Woman();
woman3.setAction("恋爱");
persons.add(woman3);
for (Person item : persons) {
item.GetConclusion();
}
}
}
改进:
abstract class Action {
// 得到男人结论或反应
public abstract void GetManConclusion(Man concreteElementA);
// 得到女人结论或反应
public abstract void GetWomanConclusion(Woman concreteElementB);
}
class Success extends Action {
@Override
public void GetManConclusion(Man concreteElementA) {
// TODO Auto-generated method stub
System.out.println("男人成功时,背后多半有一个伟大的女人。");
}
@Override
public void GetWomanConclusion(Woman concreteElementB) {
// TODO Auto-generated method stub
System.out.println("女人成功时,背后多半有一个不成功的男人。");
}
}
class Falling extends Action {
@Override
public void GetManConclusion(Man concreteElementA) {
// TODO Auto-generated method stub
System.out.println("男人失败时,闷头喝酒,谁也不用劝。");
}
@Override
public void GetWomanConclusion(Woman concreteElementB) {
// TODO Auto-generated method stub
System.out.println("女人失败时,眼泪汪汪,谁也劝不了。");
}
}
class Amativeness extends Action {
@Override
public void GetManConclusion(Man concreteElementA) {
// TODO Auto-generated method stub
System.out.println("男人恋爱时,凡事不懂也要装懂。");
}
@Override
public void GetWomanConclusion(Woman concreteElementB) {
// TODO Auto-generated method stub
System.out.println("女人恋爱时,遇事懂也装作不懂。");
}
}
abstract class Person {
public void Accept(Action visitor) {
}
}
class Man extends Person {
public void Accept(Action visitor) {
visitor.GetManConclusion(this);
}
}
class Woman extends Person {
public void Accept(Action visitor) {
visitor.GetWomanConclusion(this);
}
}
class ObjectStructure {
private List<Person> elements = new ArrayList<Person>();
public void Attach(Person element) {
elements.add(element);
}
public void Detach(Person element) {
elements.remove(element);
}
public void Display(Action visitor) {
for (Person e : elements) {
e.Accept(visitor);
}
}
}
public class Visitors {
public static void main(String[] args) {
ObjectStructure o = new ObjectStructure();
o.Attach(new Man());
o.Attach(new Woman());
// 成功时的反应
Success v1 = new Success();
o.Display(v1);
// 失败时的反应
Falling v2 = new Falling();
o.Display(v2);
// 恋爱时的反应
Amativeness v3 = new Amativeness();
o.Display(v3);
}
}