프록시 패턴은 서로 다른 다른 개체에 대한 액세스를 제어하기 위해 서로게이트 또는 자리 표시자 개체를 제공합니다.
Proxy 개체는 포함 개체와 동일한 방식으로 사용할 수 있습니다.
참가자
Subject는 RealSubject가 예상되는 모든 곳에서 Proxy를 사용할 수 있도록 RealSubject와 Proxy에 대한 공통 인터페이스를 정의합니다.
RealSubject는 Proxy가 나타내는 구체적인 개체를 정의합니다.
프록시는 RealSubject에 대한 참조를 유지 관리하고 이에 대한 액세스를 제어합니다. RealSubject와 동일한 인터페이스를 구현해야 두 가지를 서로 바꿔 사용할 수 있습니다.
아마. 실제로 해당 개체의 정의를 변경하지 않고 기존 개체의 동작을 변경해야 하는 경우 프록시 패턴을 사용하여 그렇게 할 수 있습니다. 또한 이는 완전히 구현하지 않고 클래스의 동작을 복제해야 하는 테스트 시나리오에서 매우 유용합니다.
예
internal class Program {
private static void Main(string[] args) {
NewServerProxy proxy = new NewServerProxy();
Console.WriteLine("What would you like to order? ");
string order = Console.ReadLine();
proxy.TakeOrder(order);
Console.WriteLine("Sure thing! Here's your " + proxy.DeliverOrder() + ".");
Console.WriteLine("How would you like to pay?");
string payment = Console.ReadLine();
proxy.Processpayment(payment);
Console.ReadKey();
}
}
public interface IServerP {
void TakeOrder(string order);
string DeliverOrder();
void Processpayment(string payment);
}
public class ServerP : IServerP {
private string Order;
public string DeliverOrder() {
return Order;
}
public void Processpayment(string payment){
Console.WriteLine("Server Processes the payment " + payment);
}
public void TakeOrder(string order) {
Console.WriteLine("Server takes order " + order);
Order = order;
}
}
public class NewServerProxy : IServerP {
private string Order;
ServerP _server = new ServerP();
public string DeliverOrder() {
return Order;
}
public void Processpayment(string payment) {
_server.Processpayment(payment);
}
public void TakeOrder(string order) {
Console.WriteLine("Server takes order " + order);
Order = order;
}
}