« Decorator pattern » : différence entre les versions
De Banane Atomic
Aller à la navigationAller à la recherche
Ligne 2 : | Ligne 2 : | ||
[[Category:Design Patterns]] | [[Category:Design Patterns]] | ||
= Description = | = Description = | ||
Attach additional responsibilities to an object dynamically.<br>Decorators provide a flexible alternative to subclassing for extending functionality | |||
* Add new functionalities dynamically to existing objects | * Add new functionalities dynamically to existing objects | ||
* The object does not know it is being « decorated » | * The object does not know it is being « decorated » |
Version du 7 juin 2020 à 15:27
Description
Attach additional responsibilities to an object dynamically.
Decorators provide a flexible alternative to subclassing for extending functionality
- Add new functionalities dynamically to existing objects
- The object does not know it is being « decorated »
- Decorators both inherit the original class and contain an instantiation of it
- It is an alternative to subclass to add new functionalities
Exemple
IUser.cs |
public interface IUser { string Name { get; set; } } |
User.cs |
public class User : IUser { public string Name { get; set; } public User(string name) { this.Name = name; } } |
UserTitle |
public class UserTitle : IUser { private IUser user; public string Name { get => $"{user.Name} ({Title})"; set => user.Name = value; } public string Title { get; set; } public UserTitle(IUser user, string title) { this.user = user; this.Title = title; } } |
UserEmail.cs |
public class UserEmail : IUser { private IUser user; public string Name { get => $"{user.Name} - {Email}"; set => user.Name = value; } public string Email { get; set; } public UserEmail(IUser user, string email) { this.user = user; this.Email = email; } } |
var user = new User("Nicolas"); Console.WriteLine(user.Name); // Nicolas var userWithTitle = new UserTitle(user, "Big Boss"); Console.WriteLine(userWithTitle.Name); // Nicolas (Big Boss) var userWithEmail = new UserEmail(user, "nicolas@world-company.net"); Console.WriteLine(userWithEmail.Name); // Nicolas (Big Boss) - nicolas@world-company.net |