Visitor Pattern in C# – Real-Time Example (Adding Operations Without Modifying Objects)

What is Visitor Pattern?

The Visitor Pattern is a behavioral design pattern that allows you to add new operations to existing object structures without modifying those classes.

👉 Separate:

  • Object structure
  • Operations/behaviors

Why Use Visitor Pattern?

  • Add new functionality easily
  • Avoid modifying existing classes
  • Follow Open/Closed Principle
  • Separate business logic from objects
  • Improve maintainability

Real-Time Scenario

Invoice System:

Need multiple operations:

  • PDF Export
  • Excel Export
  • Tax Calculation
  • Report Generation

👉 Instead of modifying Invoice class repeatedly, use Visitors.


Real-Time Example – Invoice Export System


Step 1: Visitor Interface


public interface IVisitor
{
    void Visit(Invoice invoice);
}

Step 2: Element Interface


public interface IElement
{
    void Accept(IVisitor visitor);
}

Step 3: Concrete Element


public class Invoice : IElement
{
    public decimal Amount { get; set; }

    public void Accept(IVisitor visitor)
    {
        visitor.Visit(this);
    }
}

Step 4: Concrete Visitors

PDF Export Visitor


public class PdfExportVisitor : IVisitor
{
    public void Visit(Invoice invoice)
    {
        Console.WriteLine(
            $"Exporting Invoice {invoice.Amount} to PDF"
        );
    }
}

Excel Export Visitor


public class ExcelExportVisitor : IVisitor
{
    public void Visit(Invoice invoice)
    {
        Console.WriteLine(
            $"Exporting Invoice {invoice.Amount} to Excel"
        );
    }
}

Usage Example


var invoice = new Invoice
{
    Amount = 5000
};

invoice.Accept(new PdfExportVisitor());

invoice.Accept(new ExcelExportVisitor());

Output


Exporting Invoice 5000 to PDF
Exporting Invoice 5000 to Excel

Key Concept

Instead of:


invoice.ExportPdf();
invoice.ExportExcel();
invoice.CalculateTax();

We do:


invoice.Accept(visitor);

👉 Operations added externally.


Diagram Understanding


Client
   ↓
Visitor
   ↓
Element (Invoice)

👉 Visitor performs operation on object.


Advantages

  • ✔ Easy to add new operations
  • ✔ Follows Open/Closed Principle
  • ✔ Separates logic from objects
  • ✔ Cleaner business logic organization
  • ✔ Good for complex object structures

Disadvantages

  • ✖ Difficult to add new element types
  • ✖ Increased complexity
  • ✖ More interfaces/classes required

When to Use

Use Visitor Pattern when:

  • Operations change frequently
  • Object structure remains stable
  • Multiple operations needed on same objects
  • Logic should remain separate from entities

Real Project Mapping (.NET + Angular)

Feature Usage
PDF export Visitor
Excel export Visitor
Tax calculations Visitor
Analytics/reporting Visitor
Validation engines Visitor

ASP.NET Core Real Example

Export Service


Invoice
   ↓
PdfVisitor
ExcelVisitor
CsvVisitor

👉 Multiple operations on same entity.


Advanced Example – File System


Files/Folders
   ↓
VirusScanVisitor
BackupVisitor
CompressionVisitor

👉 Add new operations without changing file classes.


Visitor vs Strategy

Visitor Strategy
Adds operations to objects Changes behavior/algorithm
External operation logic Encapsulated algorithm
Works on object structures Runtime behavior switching

Pro Tip

Visitor Pattern works well with:

  • Export systems
  • Reporting engines
  • Analytics
  • Validation frameworks
  • File processing systems

Summary

Visitor Pattern helps you:

  • Add new operations easily
  • Keep entities clean
  • Separate business logic from objects

👉 Perfect for:

  • Export systems
  • Reporting
  • Analytics
  • Validation engines

Comments

Popular posts from this blog

Promises in Angular

Debouncing & Throttling in RxJS: Optimizing API Calls and User Interactions

Csharp Coding - Session