访问者模式的目的是封装一些施加于某种数据结构元素之上的操作,一旦这些操作需要修改的话,接受这个操作的数据结构则可以保持不变。
访问者模式结构:
抽象访问者角色:声明了一个或者多个访问操作,形成所有的具体元素角色必须实现的接口
具体访问者角色:实现抽象访问者角色所声明的接口,也就是抽象访问者所声明的各个访问操作
抽象节点角色:声明一个接受操作,接受一个访问者对象作为一个参量
具体节点角色:实现了抽象元素所规定的接受操作
结构对象角色:可以遍历结构中的所有元素,提供一个高层次的接口让访问者对象可以访问每一个元素,可以设计成一个符合对象或者一个聚集
- public interface Person {
- void accept(Visitor visitor);
- }
- public class Woman implements Person{
- public void accept(Visitor visitor) {
- visitor.visit(this);
- }
- }
- public class Man implements Person{
- public void accept(Visitor visitor) {
- visitor.visit(this);
- }
- }
- public interface Visitor {
- public void visit(Man man);
- public void visit(Woman girl);
- }
- //成功时Man与Woman的不同表现
- public class Success implements Visitor{
- public void visit(Man man) {
- System.out.println("当男人成功时,背后多半有一个伟大的女人");
- }
- public void visit(Woman woman) {
- System.out.println("当女人成功时,背后大多有一个不成功的男人");
- }
- }
- //恋爱时Man与Woman的不同表现
- public class Love implements Visitor{
- public void visit(Man man) {
- System.out.println("当男人恋爱时,凡事不懂也装懂");
- }
- public void visit(Woman girl) {
- System.out.println("当女人恋爱时,遇事懂也装不懂");
- }
- }
· public class ObjectStructure {
· private List<Person> elements = new ArrayList<Person>();
·
· public void attach(Person element){
· elements.add(element);
· }
·
· public void detach(Person element){
· elements.remove(elements);
· }
·
· //遍历各种具体元素并执行他们的accept方法
· public void display(Visitor visitor){
· for(Person p:elements){
· p.accept(visitor);
· }
· }
· }
·
·
· public class Client {
· public static void main(String[] args) {
· ObjectStructure o = new ObjectStructure(); //依赖于ObjectStructure
· //实例化具体元素
· o.attach(new Man());
· o.attach(new Woman());
·
· //当成功时不同元素的不同反映
· Visitor success = new Success(); //依赖于抽象的Visitor接口
· o.display(success);
·
· //当恋爱时的不同反映
· Visitor amativeness = new Love(); //依赖于抽象的Visitor接口
· o.display(amativeness);
·
· }
· }