Design patterns - Proxy & Composite

Post on 27-Jan-2015

107 views 1 download

Tags:

description

Explains foundations of proxy and composite patterns

Transcript of Design patterns - Proxy & Composite

Design Patterns Proxy & Composite

@sarat, architect Experion Technologies

composite pattern

is a structural pattern

Structural design patterns ease the design by identifying a simple way

to realize relationships between entities

Compose objects into tree structures to represent part-whole hierarchies.

!

describes that a group of objects are to be treated in the same way as a single instance of an object

Leaf (primitive element)

• represents leaf objects in the composition.

• A leaf has no children.

• defines behavior for primitive objects in the composition

Composite

• defines behavior for components having children.

• stores child components.

• implements child-related operations in the Component interface.

Client

!

• manipulates objects in the composition through the Component interface.

/** "Component" */interface Graphic { //Prints the graphic. public void print();}

class CompositeGraphic implements Graphic { //Collection of child graphics. private List<Graphic> childGraphics = new ArrayList<Graphic>();

class CompositeGraphic implements Graphic { //Collection of child graphics. private List<Graphic> childGraphics = new ArrayList<Graphic>();! //Prints the graphic. public void print() { for (Graphic graphic : childGraphics) { graphic.print(); } }

class CompositeGraphic implements Graphic { //Collection of child graphics. private List<Graphic> childGraphics = new ArrayList<Graphic>();! //Prints the graphic. public void print() { for (Graphic graphic : childGraphics) { graphic.print(); } } ! //Adds the graphic to the composition. public void add(Graphic graphic) { childGraphics.add(graphic); } //Removes the graphic from the composition. public void remove(Graphic graphic) { childGraphics.remove(graphic); }}

/** "Leaf" */class Ellipse implements Graphic { //Prints the graphic. public void print() { System.out.println("Ellipse"); }}

/** Client */public class Program { public static void main(String[] args) { //Initialize four ellipses Ellipse ellipse1 = new Ellipse(); Ellipse ellipse2 = new Ellipse(); Ellipse ellipse3 = new Ellipse(); Ellipse ellipse4 = new Ellipse();

/** Client */public class Program { public static void main(String[] args) { //Initialize four ellipses Ellipse ellipse1 = new Ellipse(); Ellipse ellipse2 = new Ellipse(); Ellipse ellipse3 = new Ellipse(); Ellipse ellipse4 = new Ellipse();! //Initialize three composite graphics CompositeGraphic graphic = new CompositeGraphic(); CompositeGraphic graphic1 = new CompositeGraphic(); CompositeGraphic graphic2 = new CompositeGraphic();

/** Client */public class Program { public static void main(String[] args) { //Initialize four ellipses Ellipse ellipse1 = new Ellipse(); Ellipse ellipse2 = new Ellipse(); Ellipse ellipse3 = new Ellipse(); Ellipse ellipse4 = new Ellipse();! //Initialize three composite graphics CompositeGraphic graphic = new CompositeGraphic(); CompositeGraphic graphic1 = new CompositeGraphic(); CompositeGraphic graphic2 = new CompositeGraphic();! //Composes the graphics graphic1.add(ellipse1); graphic1.add(ellipse2); graphic1.add(ellipse3); graphic2.add(ellipse4);

/** Client */public class Program { public static void main(String[] args) { //Initialize four ellipses …! //Initialize three composite graphics …! //Composes the graphics graphic1.add(ellipse1); graphic1.add(ellipse2); graphic1.add(ellipse3); graphic2.add(ellipse4); graphic.add(graphic1); graphic.add(graphic2);! graphic.add(graphic1); graphic.add(graphic2);

/** Client */public class Program { public static void main(String[] args) { //Initialize four ellipses …! //Initialize three composite graphics …! //Composes the graphics … …! …! //Prints the complete graphic (4 times "Ellipse"). graphic.print();}

Questions?

What’s proxy pattern?

it makes the clients of a component communicate with a representative rather than to the component Itself.

enables enhanced efficiency, easier access and protection from unauthorized access.

examples?

a network proxy

large object in memory

reference counting pointer objects

Context

• A client needs access to the services of another component

• Direct access is technically possible, but may not be the best approach

Problem

• Often it’s inappropriate to access the component directly

• Direct and unrestricted access can be insecure and inefficient

Key considerations

run-time efficient

cost effective

safe for both client and component

transparent interfaces

should be similar to component’s interface

aware of performance penalties

solution

communicate to representative — proxy

proxy performs pre & post processing (e.g

access control)

structure

uses proxy to fulfill it’s task

Client

a common interface for proxy and original

AbstractOriginal

provides interface of the original to clients

proxy

ensures safe, efficient and correct access to the

original

proxy

collaborates with original

proxy

implements a particular service

Original

dynamics

implementation considerations

migrate all client responsibilities to proxy

remove all direct relationship with client

and original

variants

To shield network addresses and inter-process communication protocols from clients

Remote Proxy

Access authorization e.g network authorization to use Internet

Protection Proxy

Multiple local components can share results from a remote proxye.g. Cache server

Cache Proxy

Provide synchronized access to services in a multi-access or multi-threaded environment

Synchronization Proxy

Prevents accidental deletion of components or collects usage statistics

e.g. reference counting objects

Counting Proxy

Protects local clients from outside world

Firewall proxy

benefits

enhanced efficiency and lower cost

e.g. cache proxy

decouple clients from real objects

separate housekeeping from functionality

liabilities

less efficiency due to indirection

overkill using sophisticated strategies !

e.g. caching server in a dynamic environment

Questions?