NOTE

Visitor Pattern

Visitor-pattern notes separating data structures from operations, with a Java course example.

Software Architecture & Engineering1 min readhistorical

This is a historical learning note and may contain outdated or incomplete understanding.

1. Definition

Separate the data structure from its operations, placing each in different classes.

2. UML

3. Java

3.1. Data Structure

  • 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. Operations

  • 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("Free course: " + course.getName());
    }

    @Override
    public void visit(CodingCourse course)
    {
        System.out.println("Practical course: " + 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());
        }

    }
}

Discussion

Sign in with GitHub to comment. Discussions are stored as GitHub Issues.View on GitHub