Java设计方式-访问者模式(Visitor)

Java设计模式---访问者模式(Visitor)
package ding.study.designpatterns.visitor;
/**
* 访问者抽象类
* @author daniel
*
*/
abstract class Visitor {
/**
* 访问男人的反应 抽象
* @param concreteElementA
*/
public abstract void getVisitor(Man concreteElementA);

/**
  *访问女人的反应 抽象
  */

public abstract void getVisitor(Woman concreteElementB);
}

/**
* 人类抽象
* @author daniel
*
*/
abstract class Person{
/**
  * 接受访问
  * @param visitor
  */
public abstract void accept(Visitor visitor);
}




package ding.study.designpatterns.visitor;

public class Man extends Person {
private String sexMessage="男人";
@Override
/**
  * 访问男人时 调用 访问者的访问方法
  */
public void accept(Visitor visitor) {
  visitor.getVisitor(this);
  }

/**
  * @return the sexMessage
  */
public String getSexMessage() {
  return sexMessage;
}

}






package ding.study.designpatterns.visitor;

public class Woman extends Person {
private String sexMessage="女人";

@Override
/**
  * 访问女人时,调用 访问者的 目的
  */
public void accept(Visitor visitor) {
  visitor.getVisitor(this);

}

/**
  * @return the sexMessage
  */
public String getSexMessage() {
  return sexMessage;
}


}


package ding.study.designpatterns.visitor;
/**
* 状态为成功时 访问类
* @author daniel
*
*/
public class Success extends Visitor {
    private String type="成功";

/**
  * 访问男人
  */
@Override
public void getVisitor(Man concreteElementA) {
  System.out.println(concreteElementA.getSexMessage()+type+"时,背后多半有一个伟大的女人。");
}

/**
  * 访问女人
  */
@Override
public void getVisitor(Woman concreteElementB) {
  System.out.println(concreteElementB.getSexMessage()+type+"时,背后多半有一个不成功的男人。");
}

}


package ding.study.designpatterns.visitor;
/**
* 失败时候的访问类
* @author daniel
*
*/
public class Failing extends Visitor {
    private String type="失败";
    /**
     * 访问男人
     */
@Override
public void getVisitor(Man concreteElementA) {
  System.out.println(concreteElementA.getSexMessage()+type+"时,闷头喝酒谁也不用劝。");

}

/**
  * 访问女人
  */
@Override
public void getVisitor(Woman concreteElementB) {
  System.out.println(concreteElementB.getSexMessage()+type+"时,眼泪汪汪,谁也劝不了。");
}

}


package ding.study.designpatterns.visitor;

import java.util.ArrayList;
import java.util.List;
/**
* 人的对象集合操作
* @author daniel
*
*/
public class ObjectStructure {

/**
  * 很多人的结合
  */
private List<Person> elements=new ArrayList<Person>();
/**
  * 生人
  * @param element
  */
public void add(Person element){
  elements.add(element);
}
/**
  * 杀人
  * @param element
  */
public void delete(Person element){
  elements.remove(element);
}
/**
  * 排队报数  访问状态下 人的反应
  * @param visitor
  */
public void show(Visitor visitor){
  for(Person e :elements){
   e.accept(visitor);
  }
}


}


package ding.study.designpatterns.visitor;

public class ZTestMain {

/**
  * 测试访问者模式
  * @param args
  */
public static void main(String[] args) {
   //对象结构类
  ObjectStructure o=new ObjectStructure();
  //放入男人和女人
  o.add(new Man());
  o.add(new Woman());
  //成功状态下访问
  Success visitor1=new Success();
  o.show(visitor1);
  //失败状态下访问
  Failing visitor2=new Failing();
  o.show(visitor2);

}

}








访问者模式:(Visitor),表示一个作用于某个对象结构的各元素的操作。它使你可以在不改变元素的类的前提下定义作用于这些元素的新操作。