在不改變集合元素的前提下猾封,為一個集合中的每個元素提供多種訪問方式基茵,即每個元素有多個訪問者對象訪問莽鸿。
角色:
- Visitor:抽象的訪問者
- ConcreteVistor:具體訪問者
- ObjectStructure:提供一個高層接口椎例,允許訪問者訪問元素
- Element:定義了accept方法劳翰,接收訪問者對象
- ConcreteElement:具體元素,實現(xiàn)accept方法
package com.strife.pattern.visitor;
import java.time.Period;
import java.util.LinkedList;
import java.util.List;
/**
* 訪問者模式
* 測評
* @author mengzhenghao
* @date 2022/6/2
*/
public class Visitor {
public static void main(String[] args) {
//成功測評
ObjectStructure successStructure = new ObjectStructure();
successStructure.attach(new Man());
successStructure.attach(new Man());
successStructure.attach(new Man());
successStructure.attach(new Woman());
AbstractAction success = new Success();
successStructure.display(success);
//失敗測評
ObjectStructure failStructure = new ObjectStructure();
AbstractAction fail = new Fail();
failStructure.attach(new Man());
failStructure.attach(new Woman());
failStructure.display(fail);
}
}
/** 抽象訪問者:Visitor */
abstract class AbstractAction {
/** 得到男性的測評結(jié)果 */
public abstract void getManResult(Man man);
/** 得到女性的測評結(jié)果 */
public abstract void getWomanResult(Woman woman);
}
/** 具體訪問者:ConcreteVistor */
class Success extends AbstractAction {
@Override
public void getManResult(Man man) {
System.out.println("man success");
}
@Override
public void getWomanResult(Woman woman) {
System.out.println("woman success");
}
}
/** 具體訪問者:ConcreteVistor */
class Fail extends AbstractAction {
@Override
public void getManResult(Man man) {
System.out.println("man fail");
}
@Override
public void getWomanResult(Woman woman) {
System.out.println("woman fail");
}
}
/** 抽象元素:Element */
abstract class AbstractPerson {
/** 定義accept方法 */
public abstract void accept(AbstractAction visitor);
}
/**
* 具體元素:ConcreteElement
* 雙分派
* 首先在客戶端將具體狀態(tài)作為參數(shù)傳入Man(第一次分派)
* 然后Man類調(diào)用作為參數(shù)的 “具體方法” 中方法 getManResult 尾组,同時將自己(this)作為參數(shù)傳入(第二次分派)
*/
class Man extends AbstractPerson {
@Override
public void accept(AbstractAction visitor) {
visitor.getManResult(this);
}
}
/** 具體元素:ConcreteElement */
class Woman extends AbstractPerson {
@Override
public void accept(AbstractAction visitor) {
visitor.getWomanResult(this);
}
}
/** 數(shù)據(jù)結(jié)構(gòu)(ObjectStructure):管理很多AbstractPerson */
class ObjectStructure {
private List<AbstractPerson> people = new LinkedList<>();
public void attach(AbstractPerson person) {
people.add(person);
}
public void detach(AbstractPerson person) {
people.remove(person);
}
/** 顯示測評情況 */
public void display(AbstractAction action) {
for (AbstractPerson person : people) {
person.accept(action);
}
}
}