Advanced Java September 27 ,2025

 

Visitor Design Pattern in Java

1. Introduction

The Visitor Pattern lets you separate algorithms from the objects on which they operate.
It allows you to add new operations to existing object structures without modifying them.

2. Real-World Analogy

Think of a Tax Calculation System:

  • A company has different kinds of employees (Full-time, Part-time, Interns).
  • You want to perform different calculations (tax, benefits, bonuses) without changing the employee classes.
  • Visitor Pattern allows you to add these calculations externally without modifying existing employee classes.

3. Structure of Visitor Pattern

  • Visitor Interface → Declares visit methods for each element type.
  • Concrete Visitors → Implement the visitor interface with different operations.
  • Element Interface → Defines accept method to take a visitor.
  • Concrete Elements → Implement accept method and call the visitor.
  • Object Structure → Collection of elements to be visited.

4. Custom Implementation Example

Let’s create a Tax Calculation System for different employee types.

Step 1 – Visitor Interface

public interface Visitor {
    void visit(FullTimeEmployee employee);
    void visit(PartTimeEmployee employee);
}

Step 2 – Element Interface

public interface Employee {
    void accept(Visitor visitor);
}

Step 3 – Concrete Elements

Full-Time Employee

public class FullTimeEmployee implements Employee {
    private String name;
    private double salary;

    public FullTimeEmployee(String name, double salary) {
        this.name = name;
        this.salary = salary;
    }

    public String getName() { return name; }
    public double getSalary() { return salary; }

    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}

Part-Time Employee

public class PartTimeEmployee implements Employee {
    private String name;
    private double hourlyWage;
    private int hoursWorked;

    public PartTimeEmployee(String name, double hourlyWage, int hoursWorked) {
        this.name = name;
        this.hourlyWage = hourlyWage;
        this.hoursWorked = hoursWorked;
    }

    public String getName() { return name; }
    public double getHourlyWage() { return hourlyWage; }
    public int getHoursWorked() { return hoursWorked; }

    @Override
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}

Step 4 – Concrete Visitor

public class TaxVisitor implements Visitor {
    @Override
    public void visit(FullTimeEmployee employee) {
        double tax = employee.getSalary() * 0.2;
        System.out.println(employee.getName() + " (Full-time) tax: $" + tax);
    }

    @Override
    public void visit(PartTimeEmployee employee) {
        double tax = employee.getHourlyWage() * employee.getHoursWorked() * 0.1;
        System.out.println(employee.getName() + " (Part-time) tax: $" + tax);
    }
}

Step 5 – Object Structure

import java.util.ArrayList;
import java.util.List;

public class EmployeeCollection {
    private List employees = new ArrayList<>();

    public void addEmployee(Employee employee) {
        employees.add(employee);
    }

    public void accept(Visitor visitor) {
        for (Employee employee : employees) {
            employee.accept(visitor);
        }
    }
}

Step 6 – Client Code

public class VisitorPatternDemo {
    public static void main(String[] args) {
        EmployeeCollection employees = new EmployeeCollection();

        employees.addEmployee(new FullTimeEmployee("Alice", 5000));
        employees.addEmployee(new PartTimeEmployee("Bob", 20, 80));

        Visitor taxVisitor = new TaxVisitor();
        employees.accept(taxVisitor);
    }
}

5. Output

Alice (Full-time) tax: $1000.0
Bob (Part-time) tax: $160.0

6. Advantages

  • Adds new operations without changing existing classes.
  • Encourages single responsibility — separates data structure from operations.
  • Good for performing unrelated operations over a complex object structure.

7. Real-World Use Cases

  • Tax calculation systems.
  • Code analysis tools.
  • Reporting and exporting data in multiple formats.
  • Compilers / AST traversal (Abstract Syntax Trees).

 

Sanjiv
0

You must logged in to post comments.

Related Blogs

Generics P...
Advanced Java August 08 ,2025

Generics Part- 2

Collection...
Advanced Java July 07 ,2025

Collections Framewor...

Mastering...
Advanced Java August 08 ,2025

Mastering Java Multi...

Annotation...
Advanced Java August 08 ,2025

Annotations

Java Memor...
Advanced Java August 08 ,2025

Java Memory Manageme...

Java Lambd...
Advanced Java August 08 ,2025

Java Lambda Expressi...

Java Funct...
Advanced Java August 08 ,2025

Java Functional Inte...

Java Strea...
Advanced Java August 08 ,2025

Java Stream API

JDBC (Java...
Advanced Java August 08 ,2025

JDBC (Java Database...

JDBC (Java...
Advanced Java September 09 ,2025

JDBC (Java Database...

Annotation...
Advanced Java August 08 ,2025

Annotations

Generics
Advanced Java August 08 ,2025

Generics

Java I/O (...
Advanced Java August 08 ,2025

Java I/O (NIO)

Introducti...
Advanced Java September 09 ,2025

Introduction to Desi...

Design Pat...
Advanced Java September 09 ,2025

Design Patterns in J...

Other Prin...
Advanced Java September 09 ,2025

Other Principles Beh...

Creational...
Advanced Java September 09 ,2025

Creational Design Pa...

In Creatio...
Advanced Java September 09 ,2025

In Creational Design...

In Creatio...
Advanced Java September 09 ,2025

In Creational Design...

Creational...
Advanced Java September 09 ,2025

Creational Design Pa...

Structural...
Advanced Java September 09 ,2025

Structural Design Pa...

In Creatio...
Advanced Java September 09 ,2025

In Creational Design...

Structural...
Advanced Java September 09 ,2025

Structural Design Pa...

Builder De...
Advanced Java September 09 ,2025

Builder Design Patte...

Structural...
Advanced Java September 09 ,2025

Structural Design Pa...

Structural...
Advanced Java September 09 ,2025

Structural Design Pa...

Structural...
Advanced Java September 09 ,2025

Structural Design Pa...

Structural...
Advanced Java September 09 ,2025

Structural Design Pa...

Structural...
Advanced Java September 09 ,2025

Structural Design Pa...

Structural...
Advanced Java September 09 ,2025

Structural Design Pa...

Design Pat...
Advanced Java September 09 ,2025

Design Patterns in J...

Chain of R...
Advanced Java September 09 ,2025

Chain of Responsibil...

Command De...
Advanced Java September 09 ,2025

Command Design Patte...

Interprete...
Advanced Java September 09 ,2025

Interpreter Design P...

Iterator D...
Advanced Java September 09 ,2025

Iterator Design Patt...

Mediator D...
Advanced Java September 09 ,2025

Mediator Design Patt...

Memento De...
Advanced Java September 09 ,2025

Memento Design Patte...

Observer D...
Advanced Java September 09 ,2025

Observer Design Patt...

State Desi...
Advanced Java September 09 ,2025

State Design Pattern...

Strategy D...
Advanced Java September 09 ,2025

Strategy Design Patt...

Template M...
Advanced Java September 09 ,2025

Template Method Desi...

Prototype...
Advanced Java September 09 ,2025

Prototype Design Pat...

Java 8+ Fe...
Advanced Java October 10 ,2025

Java 8+ Features

SOLID Prin...
Advanced Java October 10 ,2025

SOLID Principles in...

Custom Imp...
Advanced Java October 10 ,2025

Custom Implementatio...

Custom Imp...
Advanced Java October 10 ,2025

Custom Implementatio...

Custom Imp...
Advanced Java October 10 ,2025

Custom Implementatio...

Custom Imp...
Advanced Java October 10 ,2025

Custom Implementatio...

How Iterat...
Advanced Java October 10 ,2025

How Iterators Work i...

How Concur...
Advanced Java October 10 ,2025

How ConcurrentHashMa...

Comparable...
Advanced Java October 10 ,2025

Comparable vs Compar...

Get In Touch

G06, Kristal Olivine Bellandur near Bangalore Central Mall, Bangalore Karnataka, 560103

+91-8076082435

techiefreak87@gmail.com