NOTE
Visitor Pattern
Visitor-pattern notes separating data structures from operations, with a Java course example.
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