设计模式 访客模式

  • 设计模式 - 访客模式

    访客模式中,我们使用一个visitor类来更改元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者的变化而变化。此模式属于行为模式类别。按照模式,Element对象必须接受Visitor对象,以便visitor对象可以处理对Element对象的操作。
  • 实例

    我们将创建一个定义接受操作的ComputerPart接口。Keyboard,Mouse,Monitor和Computer是实现ComputerPart接口的具体类。我们将定义另一个接口ComputerPartVisitor,它将定义访问者类操作。计算机使用具体的访客来做相应的动作。
    我们的演示类VisitorPatternDemo将使用Computer和ComputerPartVisitor类来演示访问者模式的使用。
    dp
    第1步 - 定义一个表示元素的接口。 ComputerPart.java
    
    public interface ComputerPart {
       public void accept(ComputerPartVisitor computerPartVisitor);
    }
    
    第2步 - 创建扩展上述类的具体类。 Keyboard.java , Monitor.java , Mouse.java , Computer.java
    
    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步 - 定义一个代表访客的接口。 ComputerPartVisitor.java
    
    public interface ComputerPartVisitor {
            public void visit(Computer computer);
            public void visit(Mouse mouse);
            public void visit(Keyboard keyboard);
            public void visit(Monitor monitor);
    }
    
    步骤4 创建实现上述类的具体访客。 ComputerPartDisplayVisitor.java
    
    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的各个部分。VisitorPatternDemo.java
    
    public class VisitorPatternDemo {
       public static void main(String[] args) {
    
          ComputerPart computer = new Computer();
          computer.accept(new ComputerPartDisplayVisitor());
       }
    }
    
    第6步 - 验证输出。
    
    Displaying Mouse.
    Displaying Keyboard.
    Displaying Monitor.
    Displaying Computer.