Saturday, June 30, 2012

Proxy Pattern

Problem Statement

I have a method which does something great, and is nice and small. It does everything i want, except some small feature that isn't core to the class. For example, I want to do some fudging for the input parameters and/or fudging the output parameters. I want to create another class to handle these orthogonal requirements.

TL;DR - Short summary

Wrap the original object in a proxy which looks like the original object to the outside world. Delegate calls to the original object eventually. This is an example of Aspect Oriented Programming.

Code Example

I'm building this example up as a series of requirements

Requirement 1: I want to be able to get my bank balance from the bank.

Requirement 2: I want to be able to log the fact someone has checked their bank balance

Requirement 3: I want to tell everyone that their bank balance is double of what it is really. But logging should log the correct value.

Requirement 4: I've changed my mind. It's hard for me to have plausible deniability if i log actual bank balances. Fudge that as well

Requirement 5: I want to cache the balance. I still expect logging and doubling.

A note on the example: Requirement 3 (the doubling filter) should probably go into the first class, it's core to the business. I just made it a proxy filter to illustrate the point about output fudging.

Conditions for a good proxy

  • The constructor accepts the item it is proxying.
  • The proxy passes requests to the original object in at least one branch of the code
  • The proxy honors all methods of the original object with the same signature (in java world, implements the same interface)
  • Proxies must be composable (this will follow from the point above): Proxy1.new(Proxy2.new(Proxy3.new(object)))
  • That does not mean the order of proxies is immaterial

Practical Uses

  • A proxy that caches the response from the inner method
  • A proxy that runs the inner method in a single database transaction
  • A proxy that adds logging before and after the method is called
  • A proxy that validates inputs

DynamicProxy

In the examples above, we overrode a single method bank_balance. Now, imaging you want a proxy to overwrite 50 different methods of an object. Enter DynamicProxy for java, and DynamicProxy/SimpleProxy for .NET. These let you override all methods in a particular interface.

Of course, ruby doesn't need that thanks to method_missing!

Rack filters

Rack provides an easy way to add proxy pattern to the app called via filters (rails cleans this up as around filters). A filter which does nothing will be as follows (notice what the constructor accepts, and what methods the filter implements)

Further Reading

15 comments:

  1. No doubt your blog article is great to me and most importantly it gives me information about my related issue.
    access New Album Releases in UK

    ReplyDelete
    Replies


    1. Hi, Great.. Tutorial is just awesome..It is really helpful for a newbie like me.. I am a regular follower of your blog. Really very informative post you shared here. Kindly keep blogging. If anyone wants to become a Java developer learn from Java Training in Chennai. or learn thru Java Online Training in India . Nowadays Java has tons of job opportunities on various vertical industry.

      Delete
  2. đồng tâm
    game mu
    cho thuê nhà trọ
    cho thuê phòng trọ
    nhac san cuc manh
    số điện thoại tư vấn pháp luật miễn phí
    văn phòng luật
    tổng đài tư vấn pháp luật
    dịch vụ thành lập công ty trọn gói
    lý thuyết trò chơi trong kinh tế học
    đức phật và nàng audio
    hồ sơ mật dinh độc lập audio
    đừng hoang tưởng về biển lớn ebook
    chiến thắng trò chơi cuộc sống ebook
    bước nhảy lượng tử
    ngồi khóc trên cây audio
    truy tìm ký ức audio
    mặt dày tâm đen audio
    thế giới như tôi thấy ebook

    Đang ngủ say thì Bạch Vũ chợt trở thân. Lưu Phong tiếp tục được nàng điều chỉnh góc độ cho mãn nhãn.

    Bộ ngực lúc này bị che một chút nhưng hạ thể lại lộ ra nhiều hơn, cặp mông trắng nõn đã chui ra khỏi chăn, kín kín hở hở, thật là làm cho người ta máu huyết sôi trào. Đáng tiếc là vẫn bị áo ngủ che mất một chút.

    “Nhanh lên, cao lên chút nữa…”

    Ngay khi Lưu Phong đang cầu khẩn thượng đế thì Bạch Vũ tiếp tục cử động. Lớp áo ngủ che cặp mông khẽ bị vén lên cao một chút. Chỉ hận khí lực chưa đủ mà thôi.

    “Thêm chút nữa…”

    Ngay khi Lưu Phong đang tiếp tục cầu khẩn thì một thanh âm quen thuộc vang lên: “Ba ba, người làm gì vậy?”

    tiểu Linh nhi? Lưu Phong đột nhiên như lò xo đứng thẳng dậy, nhìn quanh xem có Liễu Thanh Nghi không, cười ha ha nói: “Là tiểu Linh nhi. Để ba ba kể chuyện chú bé Hồ Lô cho ngươi nghe nhé.”

    May mắn chỉ là tiểu Linh nhi, Lưu Phong tùy ý có thể lái sang chuyện khác. tiểu Linh nhi cũng không truy hỏi cặn kẽ nữa.

    Kể chuyện chú bé Hồ Lô cho tiểu Linh nhi nghe xong, hắn giao lại cho Liễu Thanh Nghi. Còn mình thì quay về phòng, dặn dò Liễu Thanh Nghi không cho ai đến quấy rầy cả.

    “Công tử muốn tu luyện sao?” Ở chung với nhau lâu như vậy, Liễu Thanh Nghi cũng biết nhiều chuyện về hắn. Mỗi lần hắn tu luyện thì nàng đều ở ngoài canh cửa. Không cho ai đến quấy nhiễu.

    Đáng tiếc hôm nay nàng đã đoán sai. Lưu Phong hôm nay không tu luyện mà là cưỡng dâm tiểu khố của Bạch Vũ.
    Chuyện chấm dứt, Lưu Phong dùng đạo gia chân hỏa thiêu đốt hoàn toàn tiểu khố.

    ReplyDelete

  3. شركة نظافة بالخرج
    شركة تنظيف منازل بالخرج
    تتشرف شركة تنظيف موكيت بالخرج وتتقدم شركتنا بخدماتها مع فريق من المتخصصين والخبراء فى تنظيف وصيانه وكل مايتعلق بها من اعمال التنظيف ومكافحة الحشرات.
    شركة تنظيف مجالس بالخرج
    شركة تنظيف مساجد بالخرج
    شركة تنظيف خزانات بالخرج
    شركة رش مبيدات بالخرج


    ReplyDelete
  4. I am continually amazed by the amount of information available on this subject. What you presented was well researched and well worded in order to get your stand on this across to all your readers. Read the reviews

    ReplyDelete
  5. Much appreciated such a great amount for this data. I need to tell you I agree on a few of the focuses you make here and others might require some further survey, however I can see your perspective. find out more

    ReplyDelete
  6. Thanks for Nice and Informative Post. This article is really contains lot more information about This Topic.  https://privacyonline.com.br

    ReplyDelete
  7. Thank you for helping people get the information they need. Great stuff as usual. Keep up the great work!!! get more privacy

    ReplyDelete
  8. That appears to be excellent however i am still not too sure that I like it. At any rate will look far more into it and decide personally! lemigliorivpn.com

    ReplyDelete

  9. تقدم شركتنا افضل الخدمات المنزلية علي الاطلاق حيث انها تقدم خدمات التنظيف المتكاملة مثل تنظيف المنازل والبيوت والفلل والقصور وتنظيف الموكيت وتنظيف الكنب وتنظيف الستائر وغير من العمل النظافة يمكنك زيارة موقعنا لانها هي الافضل علي الاطلاق حيث انها توفر كل الخدمات التاليه:- ارخص شركة تنظيف منازل بالرياض
    شركة تنظيف سجاد بالرياض
    شركة تنظيف ستائربالرياض
    شركة غسيل كنب بالرياض
    شركة تنظيف مكيفات بالرياض
    شركة نقل اثاث بالرياض

    ReplyDelete
  10. I personally like your post; you have shared good insights and experiences. Keep it up. https://www.lesmeilleursvpn.com

    ReplyDelete
  11. It was a very good post indeed. I thoroughly enjoyed reading it in my lunch time. Will surely come and visit this blog more often. Thanks for sharing. Meer hierover leest je hier

    ReplyDelete
  12. That appears to be excellent however i am still not too sure that I like it. At any rate will look far more into it and decide personally! deze website

    ReplyDelete

  13. This is a very nice one and gives in-depth information. I am really happy with the quality and presentation of the article. I’d really like to appreciate the efforts you get with writing this post. Thanks for sharing.

    HR Training in Indore

    ReplyDelete