设计模式:访问者模式

设计模式:访问者模式

  • 访问者模式简介
    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. 访问者模式让我们可以根据不同的数据结构实现不同的访问策略
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值