« Decorator pattern » : différence entre les versions
Apparence
Aucun résumé des modifications |
|||
(3 versions intermédiaires par le même utilisateur non affichées) | |||
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 | |||
* The object does not know it is being « decorated » | * The object does not know it is being « decorated » | ||
* Decorators both inherit the original class and contain an instantiation of it | * Decorators both inherit the original class and contain an instantiation of it | ||
Ligne 27 : | Ligne 28 : | ||
</filebox> | </filebox> | ||
<filebox fn='UserTitle'> | <filebox fn='UserTitle.cs'> | ||
public class UserTitle : IUser | public class UserTitle : IUser | ||
{ | { |
Dernière version du 3 avril 2022 à 20:36
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.cs |
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
|