package visitor;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/*
* 访问者模式:
* 定义:封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。
*
*
* 主要包括下面几个角色:
* 抽象访问者:抽象类或者接口,声明访问者可以访问哪些元素,具体到程序中就是visit方法中的参数定义哪些对象是可以被访问的。
* 访问者:实现抽象访问者所声明的方法,它影响到访问者访问到一个类后该干什么,要做什么事情。
* 抽象元素类:接口或者抽象类,声明接受哪一类访问者访问,程序上是通过accept方法中的参数来定义的。抽象元素一般有两类方法,一部分是本身的业务逻辑,另外就是允许接收哪类访问者来访问。
* 元素类:实现抽象元素类所声明的accept方法,通常都是visitor.visit(this),基本上已经形成一种定式了。
* 结构对象:一个元素的容器,一般包含一个容纳多个不同类、不同接口的容器,如List、Set、Map等,在项目中一般很少抽象出这个角色。
*
*
* 我感觉:说白了就是一句话,自己不调用自己的方法 ,而是把自己传递给别人 让别人调用自己的方法
*
*
* 应用场景:
* 1. 假如一个对象中存在着一些与本对象不相干(或者关系较弱)的操作,
* 为了避免这些操作污染这个对象,则可以使用访问者模式来把这些操作封装到访问者中去。
* 2. 假如一组对象中,存在着相似的操作,为了避免出现大量重复的代码,也可以将这些重复的操作封装到访问者中去。
*
*/
public class Visitor {
public static void main(String[] args) {
List<Element> list = ObjectStruture.getList();
for(Element e: list){
e.accept(new Visitors());
}
}
}
/*
* 抽象访问者类
*/
interface IVisitor {
public void visit(ConcreteElementA el1);
public void visit(ConcreteElementB el2);
}
/*
* 访问者类
*/
class Visitors implements IVisitor {
public void visit(ConcreteElementA elA) {
elA.doSomething();
}
public void visit(ConcreteElementB elB) {
elB.doSomething();
}
}
/*
* 元素类
*/
abstract class Element {
public abstract void accept(IVisitor visitor);
public abstract void doSomething();
}
class ConcreteElementA extends Element {
public void doSomething(){
System.out.println("元素A");
}
public void accept(IVisitor visitor) {
visitor.visit(this);
}
}
class ConcreteElementB extends Element {
public void doSomething(){
System.out.println("这是元素2");
}
public void accept(IVisitor visitor) {
visitor.visit(this);
}
}
/*
* 结构体类
*/
class ObjectStruture {
public static List<Element> getList(){
//这里存着多个Element对象
List<Element> list = new ArrayList<Element>();
Random ran = new Random();
for(int i=0; i<5; i++){
int a = ran.nextInt(50);
if(a>25){
list.add(new ConcreteElementA());
}else{
list.add(new ConcreteElementB());
}
}
return list;
}
}
28.访问者模式
最新推荐文章于 2022-03-23 11:32:05 发布