130 lines
2.8 KiB
C#
130 lines
2.8 KiB
C#
|
/*
|
|||
|
* СТРУКТУРНЫЕ ПАТТЕРНЫ
|
|||
|
*
|
|||
|
* Глава_16: Заместитель (Proxy)
|
|||
|
*
|
|||
|
* - является суррогатом другого объекта и контролирует доступ к нему.
|
|||
|
*/
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Абстрактная сущность о беге
|
|||
|
/// </summary>
|
|||
|
public abstract class ActionObject
|
|||
|
{
|
|||
|
public abstract void Run();
|
|||
|
}
|
|||
|
|
|||
|
public class Human : ActionObject
|
|||
|
{
|
|||
|
public int Age { get; set; }
|
|||
|
public Human ()
|
|||
|
{
|
|||
|
Age = new Random().Next(14, 70);
|
|||
|
}
|
|||
|
public override void Run() => Console.WriteLine("RUN!");
|
|||
|
public Human Clone()
|
|||
|
{
|
|||
|
Human temp = new Human() { Age = this.Age };
|
|||
|
return temp;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public class AvatarV1 : ActionObject
|
|||
|
{
|
|||
|
Human human;
|
|||
|
public AvatarV1(Human human)
|
|||
|
{
|
|||
|
this.human = human.Clone();
|
|||
|
//или
|
|||
|
//this.human = human;
|
|||
|
//если есть(нужен) доступ к исходному объекту
|
|||
|
}
|
|||
|
|
|||
|
public int AvatarAge => human.Age;
|
|||
|
public override void Run()
|
|||
|
{
|
|||
|
Console.WriteLine("AvatarV1 Run");
|
|||
|
human.Run();
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// Proxy сервер
|
|||
|
/// </summary>
|
|||
|
class Client
|
|||
|
{
|
|||
|
private string id;
|
|||
|
public string Id { get => id; set => id = value; }
|
|||
|
public Client(string id = "#2022") => this.id = id;
|
|||
|
}
|
|||
|
|
|||
|
interface IServer
|
|||
|
{
|
|||
|
void AccessGranted(Client user);
|
|||
|
void AccessClosed(Client user);
|
|||
|
}
|
|||
|
|
|||
|
class Server : IServer
|
|||
|
{
|
|||
|
public Server() => Console.WriteLine("Сервер создан");
|
|||
|
public void AccessClosed(Client user)
|
|||
|
{
|
|||
|
Console.WriteLine("Closed");
|
|||
|
}
|
|||
|
|
|||
|
public void AccessGranted(Client user)
|
|||
|
{
|
|||
|
Console.WriteLine("Granted");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
class ServerProxy : IServer
|
|||
|
{
|
|||
|
private Lazy<Server> server;
|
|||
|
public ServerProxy() { }
|
|||
|
|
|||
|
public void AccessClosed(Client client)
|
|||
|
{
|
|||
|
if (server == null)
|
|||
|
{
|
|||
|
Console.WriteLine("Unknown user");
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
server.Value.AccessGranted(user: client);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
public void Autentification(Client client)
|
|||
|
{
|
|||
|
if (client.Id != "#2022") return;
|
|||
|
Console.WriteLine("OK");
|
|||
|
server = new();
|
|||
|
AccessGranted(client);
|
|||
|
}
|
|||
|
|
|||
|
public void AccessGranted(Client client)
|
|||
|
{
|
|||
|
if(server == null)
|
|||
|
{
|
|||
|
Console.WriteLine("Access Close");
|
|||
|
return;
|
|||
|
}
|
|||
|
server.Value.AccessClosed(user: client);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
class Program
|
|||
|
{
|
|||
|
public static void Main(string[] argv)
|
|||
|
{
|
|||
|
Human human = new Human();
|
|||
|
human.Run();
|
|||
|
AvatarV1 avatar = new AvatarV1(human);
|
|||
|
avatar.Run();
|
|||
|
ServerProxy proxy = new(); //proxy прослойка между сервером
|
|||
|
proxy.Autentification(new Client() { });
|
|||
|
proxy.AccessGranted(new Client() { });
|
|||
|
proxy.AccessClosed(new Client() { });
|
|||
|
}
|
|||
|
}
|