320 likes | 628 Views
The Proxy Design Pattern. Problem: Defer the cost of object creation and init. until actually used Applicability (possible contexts): Virtual Proxy : Create an expensive object on demand (lazy construction) Cache Proxy (PLoPD 2): Hold results temporarily
E N D
The Proxy Design Pattern • Problem: Defer the cost of object creation and init. until actually used • Applicability (possible contexts): • Virtual Proxy: Create an expensive object on demand (lazy construction) • Cache Proxy (PLoPD 2): Hold results temporarily • Remote Proxy: Use a local representative for a remote object (different address space) • Protection Proxy: Control access to shared object
Intent and Motivation • Intent • Provide a surrogate of placeholder for another object to control access to it. • Motivation • Deferring object creation – lazy evaluation, on demand creation • Separate this from the actual object • Client treats the Proxy as if the real object was created • Proxy interprets the on-demand evaluation policy.
Proxy Applicability • Remote proxy provides a local representation of the remote object in different address spaces • Virtual proxy creates expensive objects on demand • Protection proxy controls access to the original object, for instance when implementing access rights to objects in a separate layer • Smart reference instead of a simple pointer to count object references including • Counting references • Loading persistent objects into memory on first reference • Checking object locking on access
Proxy Participants • Proxy (ImageProxy) • Maintains a reference by which to access the real subject. • Provides an interface identical to Subject, so it can be substituted for the real subject • Controls access to the real subject and may be responsible for creating it. • Also: • For remote proxy – encoding and decoding messages (I.e., RPC) • For virtual proxy – caching the real subject • For protection proxy – check callers access rights. • Subject (Graphic) • Defines the common interface for RealSubject and Proxy so that a Proxy can be used anywhere a RealSubject can. • RealSubject (Image) • defines, the real object that the proxy represents.
Proxy • Collaborations • Proxy forwards requests to RealSubject when appropriate, depending on the kind of proxy. • May perform some operations before like a mediator, or after. • Consequences • Remote proxy – hides the fact that RealSubject is remote • Virtual proxy – optimizes such as on-demand creation • Protection proxy and smart reference – allow additional housekeeping chores when subject is accessed. • Copy-on-write – postpones creation of a copy of an object until it is necessary (if at all changed from the original).
Paragraph Paragraph Sample Context: Word Processor Document Image
Forces 1. The image is expensive to load 2. The complete image is not always necessary optimize! 2MB 2KB
A Bad Solution Obviously, the document should not be aware to the optimization, nor to the image contents, etc. document::draw(){ switch (glyph.type) { case image: if (cannot_optimize) load_full_image(); else optimize(glyph); break; case paragraph: . . .
Applicability • Behaviour of an object depends on its state, and it must change its behaviour depending on that state. • Operations have large multipart conditional statements ...
Proxy Solution (example) Solution: Provide a “surrogate” or place-holder which provides transparent access to another object Image Proxy Real Image || file_name : String real_image || get_image( ) || ImageData Draft( ) DrawDetailed( ) Document Glyph 0..n Draw( )
Proxy Solution (example):Object Diagram 2: get_image ( ) 1: DrawDetailed ( ) image aDocument Proxy 3: new (fileName) 4: DrawDetailed( ) theBitmap: RealImage
Proxy Solution (general form) RealSubject Proxy Request( ) realSubject Request( ) Subject client Request( )
Proxy Structure Provide a surrogate or placeholder for another object to control access to it