zoukankan      html  css  js  c++  java
  • 访问者模式

    一、访问者模式介绍

    1、定义与类型

    封装作用于某数据结构(如List/Set/Map等)中的各元素的操作
    可以在不改变各元素的类的前提下,定义作用于这些元素的操作
    类型:行为型

    2、适用场景

    一个数据结构如(List/Set/Map等)包含很多类型对象
    数据结构与数据操作分离

    3、优点

    增加新的操作很容易,即增加一个新的访问者

    4、缺点

    具体元素变更比较麻烦

    5、相关设计模式

    访问者模式和迭代器模式
    共同点:都是在某种数据结构上进行处理,例如List、Map、Set
    访问者模式主要用于 对保存在数据结构中的元素进行某种特定的处理
    迭代器模式主要用于 逐个遍历保存在数据结构中的元素

    二、代码示例

    模拟场景:针对免费课程和实战课程,访问者做出不同的行为

    课程抽象类:

    public abstract class Course {
        private String name;
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getName() {
            return name;
        }
    
        public abstract void accept(IVisitor visitor);
    }
    

    课程实现类1(免费课程):

    public class FreeCourse extends Course {
        @Override
        public void accept(IVisitor visitor) {
            visitor.visit(this);
        }
    }
    

    课程实现类2(实战课程):

    public class CodingCourse extends Course {
    
        private int price;
    
        public int getPrice() {
            return price;
        }
    
        public void setPrice(int price) {
            this.price = price;
        }
    
        @Override
        public void accept(IVisitor visitor) {
            visitor.visit(this);
        }
    }
    

    访问者接口:

    public interface IVisitor {
        void visit(FreeCourse freeCourse);
        void visit(CodingCourse codingCourse);
    }
    

    访问者实现类:

    public class Visitor implements IVisitor {
        @Override
        public void visit(FreeCourse freeCourse) {
            System.out.println("免费课程 : " + freeCourse.getName());
        }
    
        @Override
        public void visit(CodingCourse codingCourse) {
            System.out.println("实战课程 : " + codingCourse.getName() + ",价格 : " + codingCourse.getPrice()) ;
        }
    }
    

    测试类:

    public class Test {
    
        public static void main(String[] args) {
            List<Course> courseList = new ArrayList<Course>();
    
            FreeCourse freeCourse = new FreeCourse();
            freeCourse.setName("SpringMVC");
    
            CodingCourse codingCourse = new CodingCourse();
            codingCourse.setName("访问者模式讲解");
            codingCourse.setPrice(99);
    
            courseList.add(freeCourse);
            courseList.add(codingCourse);
    
            for (Course course : courseList) {
                course.accept(new Visitor());
            }
        }
    }
    

    输出:
    免费课程 : SpringMVC
    实战课程 : 访问者模式讲解,价格 : 99

    三、源码示例

    1、Jdk中的FileVisitor

    2、Spring中的BeanDefinitionVisitor

  • 相关阅读:
    删除文件夹
    遍历文件夹
    二分查找
    轻松记住大端小端的含义(附对大端和小端的解释)
    Motorola和Intel格式报文解析的区别
    Intel格式与Motorola格式的区别
    ADC采样工作原理详解
    软件概要设计做什么
    共模干扰和差模干扰
    什么是GPIO?
  • 原文地址:https://www.cnblogs.com/weixk/p/13632514.html
Copyright © 2011-2022 走看看