Behavioural Patterns GoF pg. 221 -222 Iterator GoF pg. 257 – 271 Memento GoF pg. 283-291 By: Dan Sibbernsen Overview • Behavioural – Concerned with algorithms and responsibilities among objects. – Also concerned with methods of communication between them – Allow you to put your “interconnected” hat on while taking off your “control” hat. Iterator • Intent – Provide a means to Iterate through a series of nodes in specific way(s) • Motivation – To traverse lists of information without having to know anything too specific about the objects – To implement multiple algorithms to traverse those nodes. Class Diagram Iterator:Implementation • Who Controls the Iteration? – External Iterator • Client controls iteration • Client must explicitly request next() on each node – Internal Iterator • Iterator controls iteration • Client hands an operation to the Iterator, Iterator tells every child in the aggregate to perform it. Implementation Benefits • External Iterator – More flexible than Internal. Can compare 2 collections easily • Internal Iterator – Easier to use, as they define the iteration logic for you. Makes portability easier. Who defines the traversal Algorithm? • Algorithm can be held by a class outside of the Iterator. It could be held by the aggregate can hold it. – Called “the cursor.” – Allows the algorithm to access private members of the aggregate (and not break encapsulation) • Algorithm is held by the iterator – Allows algorithms to be swapped out easily. How Robust is the Iterator? • If an iterator is robust it – Will allow for removal of nodes in the middle of traversal. – It does this through registering the iterator with the aggregate. If any nodes are removed, it is notified. Additional Iterator Operations • All come with first, next, isdone, and currentItem • Previous – Goes to the previous node that was iterated – Can be helpful in certain situations • SkipTo – Skips to a certain node. – Goes to a node matching specific criteria Using Polymorphic Iterators in c++ • Drawbacks – Allocated dynamically by a factory method. – Client is responsible for deleting them. Can be error prone due to multiple levels of calls, and also because of exceptions • Proxy can be used to remedy this. • Only use them when Polymorphism is required. Iterators may have privileged access • Makes coupling tighter between Iterator and Aggregate • Can be problematic if there are multiple iterators you want to apply – Solution: make private iterator-specific functions “protected” so that only Iterator subclasses can access them Iterators for composites • Use an Internal iterator to keep track of the levels-deep it has traversed. This happens recursively so everything is stored on the stack. Null Iterators • Makes traversal of Composite classes easier. • Always returns IsDone() as true. Related Patterns • Composite • Factory Method • Memento Consequences (good) • “Supports variations in the traversal of an aggregate.” • “Iterators simplify the Aggregate interface.” • “More than one traversal can be pending on an aggregate.” Memento • Intent – “Without violating encapsulation, capture and externalize an object’s internal state so that the object can be restored to this state later.” • Motivation – When we want to store off an object’s internal state without adding any complication to the object’s interface. – Perhaps for an undo mechanism Class Diagram Undo Mechanism Complications • Constraint-Solver problem – Uses multiple levels deep of objects to draw objects. – What if we want to support undo but can’t localize the changes to just one class? – Propose a Memento that gathers information from objects contained in a certain class Applicability • Use this – when you want to save state on a hierarchy’s elements. – When the hierarchy’s interface would be broken if implementation details were exposed. Participants • Memento – stores the state of the Originator • Originator – Creates the memento – “Uses the memento to restore its internal state” • CareTaker – Keeps track of the Memento – Never uses the Memento’s Interface to the Originator Collaboration • Pg. 286 (can’t find image) • Caretaker requests a memento from an Originator. • Caretaker passes back memento. • Originator uses it to restore state. Consequences (good) • “Preserves Encapsulation Boundaries” • “It simplifies Originator” • You can name your class “mementos_TheFreshMaker”!!! Consequences (bad) • Might be expensive • Difficulty defining interfaces to keep Originator encapsulated • Hidden costs in caring for mementos – Caretaker could have to keep track of a lot of information for the memento • You can name your class “mementos_TheFreshMaker” =( Implementation • Language Support – C++ lets you call Originator a friend of Memento, thus giving it access to all private members of Memento that it needs Storing Incremental Changes • If storing state happens incrementally, then we can just record the changes of what’s happened in a new memento object. • This helps with memory difficulties. Related Patterns • Command • Iterator
© Copyright 2025 Paperzz