访问者模式:表示一个作用于某对象结构中的各元素的操作,它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作。
简单的面向对象实现
Person.java
public abstract class Person {
protected String action;
/**
* 得到结论或反应
*/
public abstract void getConclusion();
public String getAction() {
return action;
}
public void setAction(String action) {
this.action = action;
}
}
class Man extends Person{
@Override
public void getConclusion() {
if("成功".equals(action)){
System.out.println(this.getClass().getSimpleName()+action+"时,背后多半有一个伟大的女人");
}else if("失败".equals(action)){
System.out.println(this.getClass().getSimpleName()+action+"时,闷头喝酒,谁都不用劝");
}else if("恋爱".equals(action)){
System.out.println(this.getClass().getSimpleName()+action+"凡是不懂也要装懂");
}
}
}
class Woman extends Person{
@Override
public void getConclusion() {
if("成功".equals(action)){
System.out.println(this.getClass().getSimpleName()+action+"时,背后大多有个不成功的男人");
}else if("失败".equals(action)){
System.out.println(this.getClass().getSimpleName()+action+"时,眼泪汪汪,谁也劝不了");
}else if("恋爱".equals(action)){
System.out.println(this.getClass().getSimpleName()+action+"遇事懂也装不懂");
}
}
}
Test.java
public class Test {
public static void main(String[] args) {
ArrayList<Person> persons = new ArrayList<Person>();
Man man1 = new Man();
man1.action="成功";
persons.add(man1);
Woman woman1 = new Woman();
woman1.action="成功";
persons.add(woman1);
Man man2 = new Man();
man2.action="失败";
persons.add(man1);
Woman woman2 = new Woman();
woman2.action="失败";
persons.add(woman1);
Man man3 = new Man();
man3.action="恋爱";
persons.add(man3);
Woman woman3 = new Woman();
woman3.action="恋爱";
persons.add(woman3);
for(Person p:persons){
p.getConclusion();
}
}
}
输出
采用模式的实例
Person.java
public abstract class Person {
public abstract void accept(Action visitor);
}
class Man extends Person{
@Override
public void accept(Action visitor) {
visitor.getManConclusion(this);
}
}
class Woman extends Person{
@Override
public void accept(Action visitor) {
visitor.getWomanConclusion(this);
}
}
Action.java
public 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) {
System.out.println(concreteElementA.getClass().getSimpleName()+" "
+this.getClass().getSimpleName()+"时,背后多半有一个伟大的女人");
}
@Override
public void getWomanConclusion(Woman concreteElementB) {
System.out.println(concreteElementB.getClass().getSimpleName()+" "
+this.getClass().getSimpleName()+"时,背后多半有一个不成功的男人");
}
}
class Failing extends Action{
@Override
public void getManConclusion(Man concreteElementA) {
System.out.println(concreteElementA.getClass().getSimpleName()+" "
+this.getClass().getSimpleName()+"时,闷头喝酒,谁都不用劝");
}
@Override
public void getWomanConclusion(Woman concreteElementB) {
System.out.println(concreteElementB.getClass().getSimpleName()+" "
+this.getClass().getSimpleName()+"时,眼泪汪汪,谁也劝不了");
}
}
class Amativeness extends Action{
@Override
public void getManConclusion(Man concreteElementA) {
System.out.println(concreteElementA.getClass().getSimpleName()+" "
+this.getClass().getSimpleName()+"凡是不懂也要装懂");
}
@Override
public void getWomanConclusion(Woman concreteElementB) {
System.out.println(concreteElementB.getClass().getSimpleName()+" "
+this.getClass().getSimpleName()+"遇事懂也装不懂");
}
}
class Marriage extends Action{
@Override
public void getManConclusion(Man concreteElementA) {
System.out.println(concreteElementA.getClass().getSimpleName()+" "
+this.getClass().getSimpleName()+"感慨道:恋爱游戏终结时,‘有妻徒刑’遥无期");
}
@Override
public void getWomanConclusion(Woman concreteElementB) {
System.out.println(concreteElementB.getClass().getSimpleName()+" "
+this.getClass().getSimpleName()+"爱情长跑路漫漫,婚姻保险保平安");
}
}
ObjectStructure.java
public class ObjectStructure {
private List<Person> elements = new ArrayList<Person>();
//增加
public void attach(Person person){
elements.add(person);
}
//移除
public void detach(Person person){
elements.remove(person);
}
//查看显示
public void display(Action visitor){
for(Person p:elements){
p.accept(visitor);
}
}
}
Test.java
public class Test {
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);
//失败时的反应
Failing f1 = new Failing();
o.display(f1);
//恋爱时的反应
Amativeness a1 = new Amativeness();
o.display(a1);
//
Marriage m4 = new Marriage();
o.display(m4);
}
}
输出
访问者模式抽象实例
Element.java
public abstract class Element {
public abstract void accept(Visitor visitor);
}
class ConcreteElementA extends Element{
@Override
public void accept(Visitor visitor) {
visitor.visitConcreteElementA(this);
}
}
class ConcreteElementB extends Element{
@Override
public void accept(Visitor visitor) {
visitor.visitConcreteElementB(this);
}
}
Visitor.java
public 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) {
System.out.println(concreteElementA.getClass().getSimpleName()
+"被"+this.getClass().getSimpleName()+"访问");
}
@Override
public void visitConcreteElementB(ConcreteElementB concreteElementB) {
System.out.println(concreteElementB.getClass().getSimpleName()
+"被"+this.getClass().getSimpleName()+"访问");
}
}
class ConcreteVisitor2 extends Visitor{
@Override
public void visitConcreteElementA(ConcreteElementA concreteElementA) {
System.out.println(concreteElementA.getClass().getSimpleName()
+"被"+this.getClass().getSimpleName()+"访问");
}
@Override
public void visitConcreteElementB(ConcreteElementB concreteElementB) {
System.out.println(concreteElementB.getClass().getSimpleName()
+"被"+this.getClass().getSimpleName()+"访问");
}
}
ObjectStructure.java
public class ObjectStructure {
private ArrayList<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);
}
}
}
Test.java
public class Test {
public static void main(String[] args) {
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);
}
}
输出