proxy

6 בSeptember 2012

תגובה אחת

Proxy pattern

 

פרוקסי הוא אחד
מהתבניות השמישות ביותר,

פרוקסי כהגדרה הוא
נציג של מישהו.. הוא עוטף אובייקט אמיתי ו”מסתיר” את כל היכולות והכוונות שלו ,
אבל שומר על המבנה שלו ועל החוקיות שלו.

נושא קרוב מאוד למתכנתי סי שארפ  זהproperties   שעוטפים שדה
אמיתי,

השימוש בפרוקסי
כרעיון מופיע בהרבה צורות שונות ,

בתור דוגמא ראשונית
נחשוב על בנק בעולם האמיתי.

לבנק יש חשבון כללי
שבו מוחזקים כל המזומנים של הבנק,

לבנק יש כמובן המון
רישומים נוספים כמו כמות הלקוחות ומצב העו”ש והחסכונות שלהם

סביר גם שבאיזשהו
מקום הבנק יודע מיהם העובדים שלו וכמה הם מרוויחים , וכו’

עכשיו בואו נחשוב על
פקיד שכל תפקידו הוא להפקיד כסף או למשוך כסף האם יש לי צורך

לתת לו גישה לכל פרטי
הבנק ורשומותיו??

אם אנחנו מסכימים
בנקודה הזאת בואו נמשיך (הנקודה היא שאין צורך לתת לו גישה) .

כמעט כל מימוש שנכתוב
על מנת להתמודד עם הבעיה שהצגנו יהווה מימוש של
proxy

אני אציג מימוש
באמצעות ירושה וחשיפת מתודות שירות חלקיות

לרוב מציגים מימוש באמצעות אינטרפייס כשהרעיון הוא לשמור על אחידות.

 

public class GeneralBank

    {

       //
  את כל הכסף מחזיק

        double allCash;

       

        //הכספת  הפרטית של
המנהל
       

        private double
ManagerSafeBox;

 

        public double AllCash

        {

            get { return allCash;
}

            set { allCash = value;
}

        }

 

        private void transferAllCash()

        {

            //מבצע
העברה בסוף
היום מהקופות לכספת
של המנהל

            ManagerSafeBox =
AllCash;

            AllCash = 0;

        }

 

      

       

        public virtual void addCash(double
amount)

        {

            AllCash += amount;

        }       

 

       public virtual void depositCash(double
amount)

        {

            AllCash -= amount;

        }

 

    }

        // בנק שמייצג לקלאס
הפרוקסי

    public
class BankForClark
: GeneralBank

    {

         

        public override void addCash(double
amount)

        {

            base.AllCash += amount;

        }

 

        public override void depositCash(double
amount)

        {

            base.AllCash -= amount;

        }

 

    }

 

 

 

    class
Program

    {

        static void Main(string[] args)

        {

            BankForClark bank1 = new
BankForClark();

            bank1.addCash(345);

            Console.WriteLine(bank1.AllCash);

 

        }

    }

 

בדוגמא הפשוטה שכאן
יש לנו קלאס עבור בנק עם שתי משתנים בסיסיים,

כל הכסף שמיוחצן
ע”י פרופרטי,  ושדה פרטי לשימוש של
המנהל בלבד ומוגדר ככספת

אישית של המנהל,

 מטבע הדברים רק המנהל יוכל להעביר בסוף היום את
הכספים לכספת שלו.

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

ועכשיו ניתן לומר
שהקלאס שיורש הוא פרוקסי לבנק האמיתי.

 

דוגמא נוספת שמאוד
נפוצה היא בשימושי
Web Service   או WCF כאשר נרצה לתת לאיזשהו קליינט גישה למידע שיושב
בשרת , לא נרצה לחשוף את כל המידע כמו שהוא לכל מי שפונה, לכן נוסיף מכונת פרוקסי
שנמצאת בין הקליינט לשרת, ואחראית לאבטחה וסינון של המידע שיוצא ולבקשות הנכנסות בהתאם להרשאות וכו’.

 

 

 

הוסף תגובה
facebook linkedin twitter email

Leave a Reply

Your email address will not be published. Required fields are marked *

תגובה אחת

  1. Oleg6 בSeptember 2012 ב 16:27

    Hebrew in code looks very bed

    Reply