设计模式:访问者模式

版权声明:本文为博主原创文章,未经博主允许不得转载。有问题可以留言或者邮箱shusheng52@126邮箱联系 https://blog.csdn.net/xiaoshusheng10/article/details/86750279

设计模式:访问者模式

  • 访问者模式简介
    1. 访问者模式中,我们使用一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。属于行为型模式
    2. 意图: 将数据结构和数据操作分离
    3. 主要解决:稳定的数据结构和一遍的操作耦合问题。
    4. 使用场景:
      1. 对象结构中的对象对应的类很少改变,但经常需要在此对象结构上定义新的操作
      2. 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而需要避免让这些操作污染对象的类,也不希望在增加新操作时候修改这些类
  • 访问者模式成分
    1. 数据结构接口:定义接受访问者的方法
    2. 访问者接口:定义接受不同数据结构的访问方法
    3. 数据结构的实现类
    4. 访问者接口实现类,实现不同访问策略
  • 访问者模式优缺点
    1. 优点:
      1. 符合单一职责原则
      2. 优秀的扩展性
      3. 灵活性
    2. 缺点:
      1. 具体元素对访问者公布细节,违反了迪米特原则
      2. 具体元素变更比较困难
      3. 违反了依赖倒置原则,依赖了具体类,没有依赖抽象
  • 访问者模式实现
    1. 数据结构接口:
      /**
       * 数据结构接口,抽象接受访问者的方法
       */
      public interface ComputerPart {
          public void accept(ComputerPartVisitor computerPartVisitor);
      }
      
    2. 访问者接口
      package com.fg.java.Visitor;
      
      /**
       * 访问者抽象类,重载方法,根据不同的数据结构实现不同的访问策略
       */
      public interface ComputerPartVisitor {
          public void visit(Computer computer);
          public void visit(Mouse mouse);
          public void visit(Keyboard keywords);
          public void visit(Monitor monitor);
      }
      
    3. 数据接口的实现类
      package com.fg.java.Visitor;
      
      /**
       * 定义数据结构
       */
      public class Computer implements  ComputerPart{
          ComputerPart parts [];
      
          public Computer( ) {
              this.parts = new ComputerPart[] {new Mouse(),new Keyboard(),new Monitor()};
          }
      
          public void accept(ComputerPartVisitor computerPartVisitor) {
              for(int i = 0; i<parts.length;++i){
                  parts[i].accept(computerPartVisitor);
              }
              computerPartVisitor.visit(this);
          }
      }
      
      package com.fg.java.Visitor;
      
      public class Keyboard implements  ComputerPart {
          public Keyboard() {
          }
      
          public void accept(ComputerPartVisitor computerPartVisitor) {
              computerPartVisitor.visit(this);
          }
      }
      
      package com.fg.java.Visitor;
      
      public class Monitor implements  ComputerPart{
          public void accept(ComputerPartVisitor computerPartVisitor) {
              computerPartVisitor.visit(this);
          }
      }
      
      package com.fg.java.Visitor;
      
      public class Mouse implements ComputerPart {
          public void accept(ComputerPartVisitor computerPartVisitor) {
              computerPartVisitor.visit(this);
          }
      }
      
    4. 访问者接口实现类
      package com.fg.java.Visitor;
      
      /**
       * 访问者实现方法,实现不同的访问策略
       */
      public class ComputerPartDisplayVisitor implements ComputerPartVisitor {
          public void visit(Computer computer) {
              System.out.println("computer");
          }
      
          public void visit(Mouse mouse) {
              System.out.println("mouse");
          }
      
          public void visit(Keyboard keywords) {
              System.out.println("keywords");
          }
      
          public void visit(Monitor monitor) {
              System.out.println("monitor");
          }
      }
      
  • 个人介绍:
    1. 访问者模式让我们可以根据不同的数据结构实现不同的访问策略

猜你喜欢

转载自blog.csdn.net/xiaoshusheng10/article/details/86750279