1.名词解释:
访问者模式:标识一个作用于某对象结构中的各元素的操作。它可使你在不改变各元素的前提下作用于这些元素的新操作。
2.代码示例:
访问者抽象类 package DesignPattern.VisitorPattern; public abstract class Visitor { public abstract void VisitConcreateElementA(ConcreateElementA concreateElementA); public abstract void VisitConcreateElementB(ConcreateElementB concreateElementB); }
实际访问者类A package DesignPattern.VisitorPattern; public class ConcreateVisitorA extends Visitor{ @Override public void VisitConcreateElementA(ConcreateElementA concreateElementA) { // TODO Auto-generated method stub System.out.println(concreateElementA.getName() + "失败时,闷头喝酒,谁也不用劝。"); } @Override public void VisitConcreateElementB(ConcreateElementB concreateElementB) { // TODO Auto-generated method stub System.out.println(concreateElementB.getName() + "失败时,眼泪汪汪,谁也劝不住。"); } }
实际访问者类B package DesignPattern.VisitorPattern; public class ConcreateVisitorB extends Visitor{ @Override public void VisitConcreateElementA(ConcreateElementA concreateElementA) { // TODO Auto-generated method stub System.out.println(concreateElementA.getName() + "成功时,背后多半有一个伟大的女人。"); } @Override public void VisitConcreateElementB(ConcreateElementB concreateElementB) { // TODO Auto-generated method stub System.out.println(concreateElementB.getName() + "成功时,背后大多有一个不成功的男人。"); } }
实际访问者类C package DesignPattern.VisitorPattern; public class ConcreateVisitorC extends Visitor{ @Override public void VisitConcreateElementA(ConcreateElementA concreateElementA) { // TODO Auto-generated method stub System.out.println(concreateElementA.getName() + "恋爱时,凡事不懂也要装懂。"); } @Override public void VisitConcreateElementB(ConcreateElementB concreateElementB) { // TODO Auto-generated method stub System.out.println(concreateElementB.getName() + "成功时,遇事懂也装作不懂。"); } }
抽象元素类 package DesignPattern.VisitorPattern; public abstract class Element { public abstract void Accept(Visitor visitor); }
实际元素类A package DesignPattern.VisitorPattern; public class ConcreateElementA extends Element{ private String name = ""; public ConcreateElementA(String name) { this.name = name; } @Override public void Accept(Visitor visitor) { // TODO Auto-generated method stub visitor.VisitConcreateElementA(this); } public String getName() { return this.name; } }
实际元素类B package DesignPattern.VisitorPattern; public class ConcreateElementB extends Element{ private String name = ""; public ConcreateElementB(String name) { this.name = name; } @Override public void Accept(Visitor visitor) { // TODO Auto-generated method stub visitor.VisitConcreateElementB(this); } public String getName() { return this.name; } }
主控程序 package DesignPattern.VisitorPattern; public class Client { public static void main(String[] args) { ObjectStructure objectStructure = new ObjectStructure(); objectStructure.add(new ConcreateElementA("男人")); objectStructure.add(new ConcreateElementB("女人")); ConcreateVisitorA v1 = new ConcreateVisitorA(); ConcreateVisitorB v2 = new ConcreateVisitorB(); ConcreateVisitorC v3 = new ConcreateVisitorC(); objectStructure.Accept(v1); objectStructure.Accept(v2); objectStructure.Accept(v3); } }