欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

访问者(visitor)模式

程序员文章站 2022-05-04 13:24:49
...

访问者模式中的角色:客户方、访问者、被访问者

应用场景:被访问者元素变化较小或不改变。访问者中的方法经常改变。

访问的方法都在访问者中定义。被访问者实现统一接口中的方法,具体方法委托给访问者中的方法实现。

 

被访问者接口:

/**
 * 被访问者接口
 */
public interface Visitable {
	
	/**
	 * 定义
	 */
	public String getDefinition(Visitor visitor);

}

 被访问者(高富帅):

public class Gaofushuai implements Visitable {
	
	private String personDefinition = "高富帅:高富帅";

	@Override
	public String getDefinition(Visitor visitor) {
		return visitor.getGaofushuaiDefinition(this);
	}

	public String getPersonDefinition() {
		return personDefinition;
	}

	public void setPersonDefinition(String personDefinition) {
		this.personDefinition = personDefinition;
	}

}

 被访问者(屌丝):

public class Diaosi implements Visitable{
	private String personDefinition = "屌丝:穷矮矬";

	@Override
	public String getDefinition(Visitor visitor) {
		return visitor.getDiaosiDefinition(this);
	}

	public String getPersonDefinition() {
		return personDefinition;
	}

	public void setPersonDefinition(String personDefinition) {
		this.personDefinition = personDefinition;
	}

	
}

 访问者接口:

/**
 * 访问者
 */
public interface Visitor {
	/*
	 * 屌丝定义
	 */
	public String getDiaosiDefinition(Diaosi diaosi);
	
	/*
	 * 高富帅定义
	 */
	public String getGaofushuaiDefinition(Gaofushuai gaofushuai);
}
 

访问者接口实现(人员访问者):

public class PersonVisitor implements Visitor {
	
	public void visitPerson(List<Visitable> list){
		Iterator it = list.iterator();
		while (it.hasNext()) {
			Visitable visitable = (Visitable)it.next();
			System.out.println(visitable.getDefinition(this));
		}
	}

	@Override
	public String getDiaosiDefinition(Diaosi diaosi) {
		return diaosi.getPersonDefinition();
	}

	@Override
	public String getGaofushuaiDefinition(Gaofushuai gaofushuai) {
		return gaofushuai.getPersonDefinition();
	}

}

 客户端访问:

public class VisitorClient {
	
	public static void main(String[] args) {
		List<Visitable> list = new ArrayList<Visitable>();
		list.add(new Diaosi());
		list.add(new Gaofushuai());
		new PersonVisitor().visitPerson(list);
	}

}

 访问结果:

屌丝:穷矮矬

高富帅:高富帅