The Composit Pattern - PowerPoint PPT Presentation

1 / 27
About This Presentation
Title:

The Composit Pattern

Description:

Compose objects into tree structures to represent part-whole hierarchies. ... You can query wether a component instance is a composite object using GetComposite ... – PowerPoint PPT presentation

Number of Views:35
Avg rating:3.0/5.0
Slides: 28
Provided by: segNj
Category:

less

Transcript and Presenter's Notes

Title: The Composit Pattern


1
The Composit Pattern
  • ZHAO Jianhua
  • Dept. of Computer SciTech,
  • Nanjing University

2
Intent
  • Compose objects into tree structures to represent
    part-whole hierarchies.
  • Let clients treat individual objects and
    compositions of objects uniformly.

3
Motivation
  • Some system let user build complex diagrams out
    of simple components.
  • A simple implementation could define classes for
    each concept of the components.
  • a problem Code that uses these classes must
    treat primitive and container objects differently.

4
Motivation(2)
  • The key of composite pattern is an abstract class
    that represents both primitives and their
    containers.
  • A typical composite structures

aPicture
aRect
aPicture
aLine
aText
aLine
aRect
5
Applicability
  • Use this pattern when
  • You want to represent part-whole hierarchies of
    objects.
  • You want clients to be able to ignore the
    difference between compositions of objects and
    individual objects. Client will treat all objects
    in the composite structure uniformly

6
Structure
Component
Client
Operation() Add(Component) Remove(Component) GetCh
ild(int)
children
Leaf
Composite
Operations()
Operation() Add(Component) Remove(Component) GetCh
ild(int)
  • Page 164

7
Participants
  • Component
  • declare the interface for objects in the
    composition.
  • implements default behavior.
  • declares an interface for accessing and managing
    its child components.
  • (opt.) defines an interface for accessing a
    components parent in the recursive structure,

8
Participants(2)
  • Leaf
  • represents leaf objects in the composition.
  • define behavior for primitive objects.
  • 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.

9
Collaborations
  • Client use the Component class interface to
    interact with objects in the composite structure.
  • If the recipient is a Leaf, then the request is
    handled directly.
  • If not, the it usually forwards requests to its
    child components, possibly performing additional
    operations before and/or after forwarding.

10
Consequences
  • defines class hierarchies consisting of primitive
    objects and composite objects.
  • makes the client simple.
  • makes it easier to add new kinds of components.
  • (disadvantage) can make your design overly
    general.

11
Implementation issues(1)
  • Explicit parent references the reference from
    child to components to their parent.
  • Simplify the traversal and management of a
    composite structure moving up, delete.
  • The references is usually defined in the
    component class.
  • You must maintain the invariant.
  • Relative pattern Chain of Responsibility

12
Implementation issues(2)
  • Sharing components
  • Its useful to share components to reduce storage
    requirements.
  • Difficult if a component can have no more than
    one parent.
  • Relative pattern Flyweight

13
Implementation issues(3)
  • Maximizing the Component interface
  • The Component class should define as many common
    operations for Composite and Leaf classes as
    possible.
  • But sometime it conflicts with the principle of
    class hierarchy design that says a class should
    only define operations that are meaning ful to
    its subclasses.
  • A little creativity treat the Leaf class as a
    special kind of Composite class.

14
Implementation issues(4.1)
  • Declaring the child management operations
  • Declare it in Component or in Composite? The
    decision involves a trade-off between safety and
    transparency.
  • Define the operations in Component gives you
    transparency, but cost safty.
  • Define the operations in Composite gives you
    safty, but you lose transparency.

15
Implementation issues(4.2)
  • We emphasize transparency over safety in this
    pattern.
  • An approach for safty without a type-unsafe cast
    declare an operation Composite GetComposite() in
    the class Component.
  • The default operation return null.
  • Each composite class override it and return this.
  • You can query wether a component instance is a
    composite object using GetComposite()

16
Implementation issues(4.3)
  • class Composite
  • class Component
  • public virtual Composite GetComposite()return
    null
  • class Composite public Component
  • public virtual Composite GetComposite()return
    this
  • if(test aComponent-gtGetComposite())
  • test-gtAdd(new Leaf)

17
Implementation issues(5)
  • Should Component implement a list of Components?
  • May define the set of children as an instance
    variable in the Component class where the child
    access and management operations are declared.
  • But incurs a space penalty for every leaf.

18
Implementation issues(6)
  • Child ordering
  • Many designs specify an ordering on the children
    of Composite.
  • When child ordering is an issue, you must design
    child access and management interfaces carefully.
  • Related pattern Iterator.

19
Implementation issues(7)
  • Caching to improve performance
  • The Composite class can cache traversal or search
    information about its children.
  • The information about its sub-tree can be cached
    in the parent object. To avoid traverse the
    sub-tree again and again.
  • A component will require invalidating the caches
    of its parents. So you need an interface for
    telling composites that their caches are invalid.

20
Implementation issues(8)
  • Who should delete components?
  • In language without garbage collection, its best
    to make a Composite responsible for deleting its
    children when its destroyed.
  • An exception when Leaf objects are immutable.

21
Implementation issues(9)
  • Whats the best data structure for storing
    components?
  • a variety of data structure can be used liked
    lists, trees, arrays, hash tables.
  • The choice depends on efficiency.
  • It isnt necessary to use a general-purpose data
    structure a subclass of Composite can implement
    its own management interface.
  • Related pattern Intrepreter.

22
Sample Code
  • Equipment computer and stereo components.
  • class Equipment
  • virtual Equipment()
  • const char Name() return _name
  • virtual Watt Power()
  • virtual Currency NetPrice()
  • virtual Currency DiscountPrice()
  • virtual void Add(Equipment )
  • virtual void Remove(Equipment )
  • virtual IteratorltEquipment gt
    CreaterIterator()
  • Protected
  • Equipment(const char )
  • private
  • const char _name

23
Sample Code
  • Leaf class
  • class FloppyDisk public Equipment
  • public
  • FloppyDisk(const char)
  • virtual FloppyDisk()
  • virtual Watt Power()
  • virtual Currency NetPrice()
  • Virtual Currency DiscountPrice()

24
Sample Code
  • The base class for equip. containing other equip.
  • class CompositeEquipment public Equipment
  • public
  • virtual CompositeEquipment()
  • virtual Watt Power()
  • virtual Currency NetPrice()
  • virtual Currency DiscountPrice()
  • virtual void Add(Equipment )
  • virtual void Remove(Equipment )
  • virtual IteratorltEquipment gtCreatIterator()
  • protected
  • CompositeEquipment(const char)
  • private
  • List ltEquipment gt _equipment

25
Sample Code
  • Default Impl. of NetPrice
  • Currency CompositeEquipmentNetPrice()
  • IteratorltEquipment gt iCreateIterator()
  • Currency total 0
  • for (i-gtFirst() !i-gtIsDone() i-gtNext()
  • total i-gtCurrentItem()-gtNetPrice()

26
Sample Code
  • class for computer chassis
  • class Chassis public CompositeEquipment
  • public
  • Chassis(const char)
  • virtual Chassis()
  • virtual Watt Power()
  • virtual Currency NetPrice()
  • virtual Currency DiscountPrice()

27
Sample Code
  • Use the classes
  • Cabinet cabinet new Cabinet(PC Cabinet)
  • Chassis chassis new Chassis(PC Chassis)
  • Cabinet-gtAdd(chassis)
  • Bus bus new Bus(NCA Bus)
  • bus-gtAdd(new Card(16Mbs Token Ring))
  • Chassis-gtAdd(bus)
  • Chassis-gtAdd(new FloppyDisk(3.5in Floppy))
  • cout ltlt The net price is ltltChassis-gtNetPrice()
    ltltendl.
Write a Comment
User Comments (0)
About PowerShow.com