Your SlideShare is downloading. ×
Composite Pattern
Composite Pattern
Composite Pattern
Composite Pattern
Composite Pattern
Composite Pattern
Composite Pattern
Composite Pattern
Composite Pattern
Composite Pattern
Composite Pattern
Composite Pattern
Composite Pattern
Composite Pattern
Composite Pattern
Composite Pattern
Composite Pattern
Composite Pattern
Composite Pattern
Composite Pattern
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Composite Pattern

1,845

Published on

Here go

Here go

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,845
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
10
Comments
0
Likes
1
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Composite Pattern bySomenath Mukhopadhyay som@som-itsolutions.com
  • 2.  Structural pattern Compose objects into a tree structure torepresent part-whole relationship
  • 3.  An abstract class represents both primitives andcontainers The client handles both the primitives and theircontainers in the same fashion
  • 4. Tree structure of the Composite Pattern
  • 5. Applicability To represent part-whole hierarchy To make the client ignorant about whether it isinteracting with an individual object or a compositeobject
  • 6. Class Diagram
  • 7. Example – base class Shapeclass Shape{public: Shape(){} virtual void Add(unsigned int id) { throw LeafClassTypeException(); }; virtual void Remove(unsigned int id){}; //leaf classes will not override it..however, it will be overridden by the composite class. virtual Shape* GetChild(unsigned int id) { throw LeafClassTypeException(); }; //Using this reference the "Chain of Responsibility" can be implemented virtual Shape* GetParentOfComponent() { return ParentOfComponent; }; virtual void SetParentOfComponent(Shape* s) { ParentOfComponent = s; } virtual void Display(){}; virtual Shape* FindItem(unsigned int id); //implementation afterwards virtual ~Shape(){};protected: Shape* ParentOfComponent; unsigned int resource_id;};
  • 8. Iterator and the FindItem functiontypedef map <unsigned int, Shape*, less<unsigned int> > theMap;theMap Resource_Map;theMap::iterator theIterator;Shape* Shape::FindItem(unsigned int id){ theIterator = Resource_Map.begin(); while (theIterator != Resource_Map.end()) { theIterator = Resource_Map.find(id); Shape* s = (*theIterator).second; theIterator++; return s; } return NULL;}
  • 9. A leaf class - Pointclass Point : public Shape{public: Point():x_Coord(0),y_Coord(0){} Point(int x, int y):x_Coord(x), y_Coord(y){} Point(const Point& p) { x_Coord = p.x_Coord; y_Coord = p.y_Coord; } Point& operator = (const Point& p) { x_Coord = p.x_Coord; y_Coord = p.y_Coord; return *this; } virtual void Display() { cout<<"X Coordinate is:"<<x_Coord<<endl; cout<<"Y Coordinate is:"<<y_Coord<<endl; } int X_COORD() { return x_Coord; } int Y_COORD() { return y_Coord; } virtual ~Point(){}private: int x_Coord; int y_Coord;};
  • 10. A leaf class – line – a final class as well//class Line is working as a leaf class.. Lets implement it as a final classclass Line : public Shape{private: //private constructor Line(unsigned int id):begin(0,0),end(0,0) { resource_id = id; Resource_Map.insert(theMap::value_type(resource_id,(Shape*)this)); } //private constructor Line(unsigned int id, Point a, Point b):begin(a),end(b) { resource_id = id; Resource_Map.insert(theMap::value_type(resource_id,(Shape*)this)); } //private copy constructor Line(const Line& in){ } //private assignment operator Line& operator=(const Line& in){ }public: virtual void Display() { cout<<"Begining point is:"; begin.Display(); cout<<"End Point is:"; end.Display(); } static Line* CreateLine(unsigned int id, Point a, Point b) { return new Line(id,a,b); } virtual ~Line(){}private: Point begin; Point end;};
  • 11. A leaf class – rectangle – a final class as wellclass Rectangle : public Shape{private: //private constructor Rectangle(unsigned int id, Point& p, int width, int height) { top_left = p; top_right = Point(p.X_COORD() + width, p.Y_COORD()); bottom_left = Point(p.X_COORD() , p.Y_COORD() + height); bottom_right = Point(p.X_COORD() + width, p.Y_COORD() + height); resource_id = id; Resource_Map.insert(theMap::value_type(resource_id,(Shape*)this)); } //private copy constructor Rectangle(const Rectangle& in){ } //private assignment operator Rectangle& operator=(const Rectangle& in) { }public: static Rectangle* CreateRectange(unsigned int id, Point& p, int width, int height) { return new Rectangle(id, p, width, height); } virtual ~Rectangle(){} virtual void Display() { cout<<"The four vertices are:"<<endl; cout<<"Top Left :" ; top_left.Display(); cout <<"Top Right :"; top_right.Display(); cout<<"Bottom Left :"; bottom_left.Display(); cout<<"Bottom Right :"; bottom_right.Display(); } //Attributesprivate: Point top_left; Point top_right; Point bottom_left; Point bottom_right;};
  • 12. A composite class - pictureclass Picture : public Shape{public: Picture(unsigned int id) { resource_id = id; Resource_Map.insert(theMap::value_type(resource_id,(Shape*)this)); } virtual void Display() { vector<Shape*>::iterator p = Components.begin(); while (p != Components.end()) { (*p)->Display(); p++; } } //Adds the component with the resource id equal to the passed parameter virtual void Add (unsigned int id) { Shape* s = FindItem(id); Components.push_back(s); s->SetParentOfComponent(this); }
  • 13. Class Picture ... contd...//removes the component from the list with the resource_id equalto the parameter passed virtual void Remove(unsigned int id) { Shape* s = FindItem(id); vector<Shape*>::iterator p = Components.begin(); int pos = 0; while (p != Components.end()) { if(Components.at(pos) == s) break; pos++; p++; } Components.erase(p); s->SetParentOfComponent(NULL); }
  • 14. Class Picture ... contd...//will return the chile having the id equal to the passed value. virtual Shape* GetChild (unsigned int id) { return FindItem(id); } virtual ~Picture() { vector<Shape*>::iterator p = Components.begin(); int pos = 0; while (p != Components.end()) { delete(Components.at(pos)); p++; pos++; } Components.clear(); }private: vector<Shape*> Components;};
  • 15. void main() The client - main(){ Point p1(10,20); Point p2(30,40); Point p3(50,60); Point p4(70,80); Point p5(100,110); Point p6(150,200); Line* l1 = Line::CreateLine(ID_LINE1,p1,p2); try { l1->Add(0); } catch(LeafClassTypeException& e) { e.printerrormsg(); } Line* l2 = Line::CreateLine(ID_LINE2,p3,p4); Line* l3 = Line::CreateLine(ID_LINE3,p5,p6); Rectangle* r1 = Rectangle::CreateRectange(ID_RECTANGLE1, p1, 50,25); Shape* p = new Picture(ID_PICTURE); p->Add(ID_LINE1); p->Add(ID_LINE2); p->Add(ID_LINE3); p->Add(ID_RECTANGLE1); (p->GetChild(ID_RECTANGLE1))->Display(); p->Remove(ID_RECTANGLE1); p->Display(); cout<<p<<endl; cout<<l1->GetParentOfComponent()<<endl; delete p;}
  • 16. The helper exception classclass LeafClassTypeException{public: void printerrormsg() { cout<<"This is a leaf class"<<endl; }};
  • 17. Implementation Details Every component is identifiable through itsresource id Whenever we create an object (leaf or compositeobject), it creates a key pair of the id and thepointer to that object and pushes this key into aMAP, from which we can easily search for thatcomponent in later times through its resource id
  • 18. Implementation details The leaf classes, namely Line and Rectanglehave been implemented as final classes bymaking their constructors, copy constructors andassignment operators private and providing staticmember functions to create them.
  • 19. Issues GetParentofComponent can be used to traversethe tree hierarchy We have to make sure that any child can have acomposite object as its parent No child can have another child if its a leaf Whenever a leaf class tries to add a child itthrows the LeafClassException
  • 20. Issues Add and Remove functions have been defined inthe Root class. For the leaf classes these just throw exceptions However it helps the client to treat leaf andcomposite objects uniformly

×