/* * СТРУКТУРНЫЕ ПАТТЕРНЫ * * Глава_16: Заместитель (Proxy) * * - является суррогатом другого объекта и контролирует доступ к нему. */ /// /// Абстрактная сущность о беге /// 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(); } } /// /// Proxy сервер /// 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; 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() { }); } }