在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。

注意事项:访问者可以对功能进行统一,可以做报表、UI、拦截器与过滤器。


示例如下: 此处输入图片的描述

  1. 定义一个表示元素的接口

     public interface ComputerPart {
        public void accept(ComputerPartVisitor computerPartVisitor);
     }
    
  2. 创建扩展了上述类的实体类

     public class Keyboard  implements ComputerPart {
         
        @Override
        public void accept(ComputerPartVisitor computerPartVisitor) {
           computerPartVisitor.visit(this);
        }
     }
    
     public class Monitor  implements ComputerPart {
         
        @Override
        public void accept(ComputerPartVisitor computerPartVisitor) {
           computerPartVisitor.visit(this);
        }
     }
    
     public class Mouse  implements ComputerPart {
         
        @Override
        public void accept(ComputerPartVisitor computerPartVisitor) {
           computerPartVisitor.visit(this);
        }
     }
    
     public class Computer implements ComputerPart {
           
        ComputerPart[] parts;
         
        public Computer(){
           parts = new ComputerPart[] {new Mouse(), new Keyboard(), new Monitor()};      
        } 
         
         
        @Override
        public void accept(ComputerPartVisitor computerPartVisitor) {
           for (int i = 0; i < parts.length; i++) {
              parts[i].accept(computerPartVisitor);
           }
           computerPartVisitor.visit(this);
        }
     }
    
  3. 定义一个表示访问者的接口

     public interface ComputerPartVisitor {
        public void visit(Computer computer);
        public void visit(Mouse mouse);
        public void visit(Keyboard keyboard);
        public void visit(Monitor monitor);
     }
    
  4. 创建实现了上述类的实体访问者

     public class ComputerPartDisplayVisitor implements ComputerPartVisitor {
         
        @Override
        public void visit(Computer computer) {
           System.out.println("Displaying Computer.");
        }
         
        @Override
        public void visit(Mouse mouse) {
           System.out.println("Displaying Mouse.");
        }
         
        @Override
        public void visit(Keyboard keyboard) {
           System.out.println("Displaying Keyboard.");
        }
         
        @Override
        public void visit(Monitor monitor) {
           System.out.println("Displaying Monitor.");
        }
     }
    
  5. 使用 ComputerPartDisplayVisitor 来显示 Computer 的组成部分

     public class VisitorPatternDemo {
        public static void main(String[] args) {
         
           ComputerPart computer = new Computer();
           computer.accept(new ComputerPartDisplayVisitor());
        }
     }