Visitor pattern

De Banane Atomic
Version datée du 3 avril 2022 à 20:47 par Nicolas (discussion | contributions) (→‎Example)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Aller à la navigationAller à la recherche

Description

Allow adding new behaviors to existing class hierarchy without altering existing code.
This pattern is particularly useful when, you cannot modify existing classes but need to add new features.

Example

User.cs
public class User
{
    public string Name { get; set; }

    public User(string name)
    {
        this.Name = name;
    }

    public void Accept(IVisitor visitor)
    {
        visitor.Visit(this);
    }
}
IVisitor.cs
public interface IVisitor
{
    void Visit(User user);
}
TitleVisitor.cs
public class TitleVisitor : IVisitor
{
    public string Title { get; set; }

    public TitleVisitor(string title)
    {
        this.Title = title;
    }

    public void Visit(User user)
    {
        user.Name += $" ({this.Title})";
    }
}
Cs.svg
var user = new User("Nicolas");
Console.WriteLine(user.Name);  // Nicolas

user.Accept(new TitleVisitor("Boss"));
Console.WriteLine(user.Name);  // Nicolas (Big Boss)