NOTE

6.24 访问者模式

1. 定义 将数据结构和操作分离,操作和数据结构各自在不同的类中 2. UML 3. Java 3.1. 数据结构 - Course - CodingCourse - FreeCourse 3.2. 操作 - IVisitor - Visitor 3.3. client

Software Architecture & Engineering约 1 分钟读完historical

这是历史学习笔记,可能存在过时或不完整的理解。

1. 定义

将数据结构和操作分离,操作和数据结构各自在不同的类中

2. UML

3. Java

3.1. 数据结构

  • Course
public abstract class Course
{
    private String name;

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public abstract void accept(IVisitor visitor);
}
  • CodingCourse
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);
    }
}
  • FreeCourse
public class FreeCourse extends Course
{
    @Override
    public void accept(IVisitor visitor)
    {
        visitor.visit(this);

    }
}

3.2. 操作

  • IVisitor
public interface IVisitor
{
    void visit(FreeCourse course);
    void visit(CodingCourse course);

}
  • Visitor
public class Visitor implements IVisitor
{
    @Override
    public void visit(FreeCourse course)
    {
        System.out.println("免费课程:" + course.getName());
    }

    @Override
    public void visit(CodingCourse course)
    {
        System.out.println("实战课程:" + course.getName() + " price: " + course.getPrice());
    }
}

3.3. client


public class Client
{
    public static void main(String[] args)
    {
        List<Course> courses = new ArrayList<>();

        FreeCourse freeCourse = new FreeCourse();
        freeCourse.setName("hahaha");


        CodingCourse codingCourse = new CodingCourse();
        codingCourse.setName("hahaha");
        codingCourse.setPrice(1111);

        courses.add(freeCourse);
        courses.add(codingCourse);


        for (Course cours : courses)
        {
            cours.accept(new Visitor());
        }

    }
}

讨论

使用 GitHub 账号参与讨论,评论会保存在 GitHub Issues 中。在 GitHub 查看