« Proxy pattern » : différence entre les versions

De Banane Atomic
Aller à la navigationAller à la recherche
(Page créée avec « Category:CSharp Category:Design Patterns = Description = * proxy object controls the creation of and access to subject object * proxy and subject objects share the… »)
 
 
(7 versions intermédiaires par le même utilisateur non affichées)
Ligne 2 : Ligne 2 :
[[Category:Design Patterns]]
[[Category:Design Patterns]]
= Description =
= Description =
* proxy object controls the creation of and access to subject object
Provide a surrogate or placeholder for another object to control access to it.
* proxy and subject objects share the same interface
* Control access to an object
* Proxy and subject objects share the same interface


== Proxy vs decorator pattern ==
== Proxy vs decorator pattern ==
* Decorator informs and empowers its client, it adds known functionalities to an object
* Decorator informs and empowers its client, it adds functionalities to an object.<br>The client knows those functionalities.
* Proxy restricts and disempowers its client, it controls access to an object with unknown functionalities like authentication
* Proxy restricts and disempowers its client, it controls access to an object.<br>The client doesn't know those control access functionalities.


= Exemple =
= Exemple =
Ligne 54 : Ligne 55 :
     }
     }


     public IReadOnlyList<User> GetUsers()
     public IReadOnlyList<User> GetUsers() => userClient?.GetUsers();
    {
        if (userClient == null)
        {
            return null;
        }
        else
        {
            return userClient.GetUsers();
        }
    }
}
}
</filebox>
</filebox>


<kode lang='cs'>
<kode lang='cs'>
var userClient = new UserClient();
IUserClient userClient = new UserClient();
// call GetUsers from UserClient: no restrictions
// call GetUsers from UserClient: no restrictions
var users = userClient.GetUsers();
var users = userClient.GetUsers();
Console.WriteLine(string.Join('\n', users.Select(x => $"{x.Name}")));
Console.WriteLine(string.Join('\n', users.Select(x => $"{x.Name}")));


var proxyUserClient = new ProxyUserClient();
userClient = new ProxyUserClient();
// call GetUsers from ProxyUserClient: authentication restriction
users = proxyUserClient.GetUsers();
if (users == null)
    Console.WriteLine("You to authenticate first.");
else
    Console.WriteLine(string.Join('\n', users.Select(x => $"{x.Name}")));


// authentication
// authentication
proxyUserClient.Authenticate("Nicolas", "0000");
((ProxyUserClient)userClient).Authenticate("Nicolas", "0000");
users = proxyUserClient.GetUsers();
 
// call GetUsers from ProxyUserClient: authentication restriction
users = userClient.GetUsers();
if (users == null)
if (users == null)
     Console.WriteLine("You to authenticate first.");
     Console.WriteLine("You need to authenticate first.");
else
else
     Console.WriteLine(string.Join('\n', users.Select(x => $"{x.Name}")));
     Console.WriteLine(string.Join('\n', users.Select(x => $"{x.Name}")));
</kode>
</kode>

Dernière version du 7 juin 2020 à 15:28

Description

Provide a surrogate or placeholder for another object to control access to it.

  • Control access to an object
  • Proxy and subject objects share the same interface

Proxy vs decorator pattern

  • Decorator informs and empowers its client, it adds functionalities to an object.
    The client knows those functionalities.
  • Proxy restricts and disempowers its client, it controls access to an object.
    The client doesn't know those control access functionalities.

Exemple

public class User
{
    public string Name { get; set; }
}
IUserClient.cs
public interface IUserClient
{
    IReadOnlyList<User> GetUsers();
}
UserClient.cs
public class UserClient : IUserClient
{
    public IReadOnlyList<User> GetUsers()
    {
        return new[]
        {
            new User { Name = "Nicolas" },
            new User { Name = "Paul" }
        };
    }
}
ProxyUserClient
public class ProxyUserClient : IUserClient
{
    private UserClient userClient;

    public bool Authenticate(string userName, string password)
    {
        if (userName == "Nicolas" && password == "0000")
        {
            userClient = new UserClient();
            return true;
        }

        return false;
    }

    public IReadOnlyList<User> GetUsers() => userClient?.GetUsers();
}
Cs.svg
IUserClient userClient = new UserClient();
// call GetUsers from UserClient: no restrictions
var users = userClient.GetUsers();
Console.WriteLine(string.Join('\n', users.Select(x => $"{x.Name}")));

userClient = new ProxyUserClient();

// authentication
((ProxyUserClient)userClient).Authenticate("Nicolas", "0000");

// call GetUsers from ProxyUserClient: authentication restriction
users = userClient.GetUsers();
if (users == null)
    Console.WriteLine("You need to authenticate first.");
else
    Console.WriteLine(string.Join('\n', users.Select(x => $"{x.Name}")));