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
Post a Comment