תגיות: , ,
אין תגובות

תבנית העיצוב Proxy הינה תבנית פשוטה ושימושית המוטמעת בכמה מערכות נפוצות כגון WCF ו Entity Framewwork.

באופן כללי הרעיון של הProxy הוא לספק מעין 'תחליף' לשירות אמיתי על מנת להתערב בתהליך שלו.

למשל – רוצים לפנות לService אבל רוצים לבדוק בכניסה לשירות מה רמת ההרשאות הקיימות למשתמש הספציפי, ולכן חושפים Proxy המממש את אותו Interface כמו הService האמיתי.

Proxy יכול לשמש לשיפור ביצועים במערכת קיימת, בלי לגעת בהתנהגות של האובייקט המקורי (ובכך הוא מממש את Open-Closed Principle: פתוח להרחבות אך סגור לשינויים).

ניתן להצביע על שלושה שימושים מפורסמים לשימוש בProxy:

1. Remote proxy – משמש כייצוג מקומי של אובייקט מרוחק, ויוצר אבסטרקציה של פרטי ההיתחברות לאובייקט המרוחק (כך למשל עובד WCF).

2. Virtual proxy – מייצר אובייקטים שיקר (מבחינת משאבי עיבוד וזיכרון) לייצר מראש, ועל כן מייצרים אותם רק כשיש צורך אמיתי (Lazy Loading).

 Lazy loading היא אופטמיזציה לביצועים שאפשר לעשות בקוד כאשר אובייקט נקרא אך אין צורך ממשי בכל הרכיבים שלו.

דוגמא: אובייקטים הנשמרים בDB מכילים קשרים רבים ורשומות נלוות רבות שלא תמיד צריך.

למשל לאובייקט Order שמייצג הזמנת מוצרים יש רשימה של orderDedail, והוא מקושר לטבלת Customer.

כל orderdetail מקושר לטבלת product.

כל customer מקושר לטבלת ההזמנות וכו' וכו'.

יצירת אובייקט ORDER על כל שדותיו והקשריו יכול לגרום לטעינת מאות רשומות מהDB. ואם כל מה שאנו צריכים זה מספר הזמנה או סכום לתשלום – אין לנו צורך בפרטי ההזמנה או בפרטי הלקוח.

ה LAZY LOADING מאפשר להביא רק את האובייקטים שאנחנו באמת צריכים.

כדאי לזכור ש LAZY LOADING כמו כל כלי לשיפור ביצועים, לא אמור להיות ברירת מחדל, אלא נתון לשימוש בהתאם לצרכים המשתנים. הרבה ORM מאפשרים למפות את האובייקטים שנטענים בLAZY LOADING או EAGER LOADING.

3. Protection proxy – עומד כ'שומר' על מנת לשלוט על הרשאות לפעולה.

 

מבנה:

גם הProxy וגם האובייקט האמיתי מממשים את אותו Interface.

האובייקט האמיתי עושה את הפעולה הרצויה. הProxy מכיל מופע של האובייקט האמיתי ומפעיל את הפונקציונליות שלו בהתאם לצורך ולהגדרות כגון פניה לשירות, או lazy loading לשיפור הביצועים.

דרך אחרת למימוש Proxy היא בלי Interface אלא על ידי כך שה Proxy יורש את האובייקט האמיתי ומפעיל את מתודות הbase.

שימוש:

הקליינט עובד עם הProxy כאילו שהוא היה האובייקט האמיתי, וה Proxy שולט על הגישה לאובייקט האמיתי ומעביר לו פניות רק במידת האפשר והצורך.

הקליינט לא צריך להשתנות על מנת לעבוד עם Proxy, אבל הProxy צריך להמשיך להיות מסונכרן עם האובייקט האמיתי, לכן טוב לעבוד עם כלים אוטומטיים ליצירת Proxy כאשר עובדים עם ORM או עם WCF.

 

השחקנים:

השחקנים המרכזיים הם:

1. ISubject – הInterface שממומש הן על ידי הProxy והן על ידי הClass האמיתי.

2. RealSubject – הClass האמיתי המממש את ISubject.

3. ProxySubject – הClass המממש את ISubject ומחזיק משתנה מסוג RealSubject.

דוגמת קוד:

 

 

 

   1: using System;

   2:  

   3: namespace ProxyPattern

   4: {

   5:     public interface ISubject

   6:     {

   7:         string GetData();

   8:     }

   9:  

  10:     class  RealSubject : ISubject

  11:     {

  12:         private readonly string _data;

  13:  

  14:         public RealSubject()

  15:         {

  16:             _data = "Real Data";

  17:         }

  18:         public string GetData()

  19:         {

  20:             return _data;

  21:         }

  22:     }

  23:  

  24:     public  class ProxySubject : ISubject

  25:     {

  26:         readonly RealSubject _client = new RealSubject();

  27:        

  28:  

  29:         public string GetData()

  30:         {

  31:             return "Proxy Data + " + _client.GetData();

  32:         }

  33:     }

  34:  

  35:     class Program

  36:     {

  37:         private static void Main()

  38:         {

  39:             var proxy = new ProxySubject();

  40:             Console.WriteLine(proxy.GetData());

  41:  

  42:             Console.ReadKey();

  43:         }

  44:     }

  45: }

הוסף תגובה " class="ir icon-in">linkedin twitter email