简介
UML图

应用场景
- 适用于数据结构相对稳定且算法易于变化的系统,该模式将数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化
- 增加新的操作较容易
示例
- Visitor:
public abstract class Action {
    /**
     * 男人的结论
     *
     * @param man
     */
    public abstract void manConclusion(Man man);
    /**
     * 女人的结论
     *
     * @param woman
     */
    public abstract void womanConclusion(Woman woman);
}
public class Success extends Action {
    @Override
    public void manConclusion(Man man) {
        System.out.println("背后有个强大的女人!");
    }
    @Override
    public void womanConclusion(Woman woman) {
        System.out.println("个人素质优秀!");
    }
}
- Element:
public abstract class People {
    /**
     * 男女态度
     *
     * @param visitor
     */
    public abstract void accept(Action visitor);
}
public class Man extends People {
    @Override
    public void accept(Action visitor) {
        visitor.manConclusion(this);
    }
}
public class Woman extends People {
    @Override
    public void accept(Action visitor) {
        visitor.womanConclusion(this);
    }
}
- ObjectStructure:
public class ObjectStructure {
    private final List<People> peopleList = new ArrayList<>();
    /**
     * 添加
     *
     * @param people
     */
    public void add(People people) {
        peopleList.add(people);
    }
    /**
     * 删除
     *
     * @param people
     */
    public void remove(People people) {
        peopleList.remove(people);
    }
    /**
     * 结果展示
     */
    public void display(Action visitor) {
        for (People p :
                peopleList) {
            p.accept(visitor);
        }
    }
}
- 运行
public class Main {
    public static void main(String[] args) {
        ObjectStructure objectStructure = new ObjectStructure();
        objectStructure.add(new Woman());
        objectStructure.add(new Man());
        Success success = new Success();
        objectStructure.display(success);
    }
}

总结
-  优点 - 满足开闭原则,新增操作只需新增访问类即可
 
-  缺点 - 增加新的数据结构会变得困难
 









