প্রক্সি প্যাটার্ন একটি সারোগেট বা প্লেসহোল্ডার অবজেক্ট প্রদান করে যাতে অন্য একটি অবজেক্টের এক্সেস নিয়ন্ত্রণ করা যায়।
প্রক্সি অবজেক্টটি কন্টেইন করা অবজেক্টের মতোই ব্যবহার করা যায়।
পার্টিসিপেন্টস (The Participants)
- Subject: RealSubject এবং Proxy-এর জন্য কমন ইন্টারফেস ডিফাইন করে যাতে Proxy যেকোনো জায়গায় RealSubject-এর বদলে ব্যবহার করা যায়।
- RealSubject: কনক্রিট অবজেক্ট जिसे Proxy প্রতিনিধিত্ব করে।
- 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;
}
}
ব্যাখ্যা: NewServerProxy ক্লাস ServerP ক্লাসকে র্যাপ করে। এটি অর্ডার নেয়, ডেলিভারি করে এবং পেমেন্ট প্রসেস করে—অবজেক্টের আসল লজিক ServerP-এ থাকা সত্ত্বেও। এটি লেজি লোডিং, অ্যাক্সেস কন্ট্রোল, লগিং ইত্যাদির জন্য ব্যবহার করা হয়।