design patterns. cs351 - software engineering (ay2004)slide 2 overview the need to manage complexity...

123
Design Patterns

Upload: evangeline-lucas

Post on 18-Dec-2015

218 views

Category:

Documents


0 download

TRANSCRIPT

Design Patterns

CS351 - Software Engineering (AY2004) Slide 2

Overview• The need to manage complexity• Place of data structures and algorithms• Class diagrams in UML• Beyond objects to patterns• Example pattern• Reference: Gamma et.al. chapter 1

– http://hillside.net/patterns– http://www.cs.wustl.edu/~schmidt/patterns-info.html

CS351 - Software Engineering (AY2004) Slide 3

Managing software complexity• There is a desperate need to be able to generate

complex, reliable software.– increasing functionality– increasing machine capacity– decreasing software quality

• Examples of poor software quality?

CS351 - Software Engineering (AY2004) Slide 4

How can you manage complexity?• Software? Filing system? Building a house?

– structure?– components?– techniques?– processes?

• Let’s concentrate on structure and see how we can manage complexity there.

CS351 - Software Engineering (AY2004) Slide 5

We tend to learn programming bottom-up

• Start with simple values and variables– integers, booleans, reals– assignment, conditional statements, loops

• Work up to data structures – sets of values in relationship– commonly occurring abstractions

• arrays, linear lists, stacks, queues• trees, graphs

• Examine interplay between data structures and algorithms– choice of data structure affects efficiency of

algorithm

CS351 - Software Engineering (AY2004) Slide 6

Data structures and classes• In object-oriented terms, data structures and associated

algorithms are usually described by abstract data types and encapsulated in objects or classes.– e.g. List, Tree, Graph, Trie, etc.

• Get the data structures right and everything else will follow– How do you get the data structures right?– How do you get the classes right?

• How do you get a broader view of a system? Another level of abstraction?– consider classes as components

• What are good ways of combining classes?– combine classes to give design patterns

CS351 - Software Engineering (AY2004) Slide 7

Abstraction given by class diagrams• Can represent classes as nodes in a graph, with edges

giving the relationships between the classes• Nodes can indicate state, behaviour (, identity) of

classes– State = attributes associated such an object (the

instance variables).– Behaviour = operations applicable to such an object

(the instance methods).– Identity = unique value that differentiates one object

from another (usually implicit)• Examples

– Bank account– University professor

CS351 - Software Engineering (AY2004) Slide 8

Nodes can indicate more detail• Note: included attributes do not include references to

other objects – include these by associations• Types:

– e.g. balance: real– e.g. deposit(amount: real): void

• Access control:– public: + balance: real– protected: # balance: real– private: – balance: real

CS351 - Software Engineering (AY2004) Slide 9

Nodes can indicate more detail• Identify class variables and methods by underlining• Annotate special kinds of components with stereotypes

– e.g. «constructor» BankAccount()– e.g. «interface» Graph

CS351 - Software Engineering (AY2004) Slide 10

Class relationships• Classes are related to other classes

– a GraphBase class may implement a Graph interface– a GraphImp class may use NodeImp and EdgeImp

classes– a SavingsAccount class may extend a BankAccount

class• These relationships are drawn as arcs in the class

diagram

CS351 - Software Engineering (AY2004) Slide 11

Edge annotations• (Central) label indicates significance of association

– context determines which way to read the association– e.g. an Edge joins two Nodes

• End-point labels indicate roles– implications for implementation

• Multiplicity indicates number of participants– e.g. optional: 0..1– e.g. zero or more: 0..*– e.g. one or more: 1..*

Node

labelsetLabel(lbl)getLabel()

2node joins edge

1 Edge

labelsetLabel(lbl)getLabel()

CS351 - Software Engineering (AY2004) Slide 12

Edge annotations• Arrow heads indicate navigation direction

– bidirectional navigation– unidirectional navigation– implications for implementation

• Style of arrow:– e.g. inherits: A inherits B– e.g. implements: A implements B– e.g. aggregates: A aggregates B– e.g. composite: A is a composite of B

CS351 - Software Engineering (AY2004) Slide 13

Aggregates versus composites• Aggregates and composites indicate a special

association– their use is optional

• Aggregates indicate a part-whole relationship• Composites indicate a part-whole relationship where

the whole strongly owns the parts– Copy/delete the whole → copy/delete the parts

• E.g. student enrolled in a degree – no aggregation• E.g. degree includes compulsory course – aggregation

– not composite – courses may belong to multiple degree

• E.g. building consists of 4 floors – composite– floors cannot belong to more than one building

CS351 - Software Engineering (AY2004) Slide 14

Specializing BankAccount• Inheritance and software reuse

– A bank account with an overdraft facility– A tenured versus contract University teacher

• Reuse state and behaviour• Fundamental to the provision of • Graphical User Interfaces.

CS351 - Software Engineering (AY2004) Slide 15

Relating BankAccount and Customer• Objects can use other objects to accomplish their tasks

– A bank account could have an associated customer– The customer object could be notified about overdrafts

• Reuse state and behaviour• Maintains encapsulation

CS351 - Software Engineering (AY2004) Slide 16

Inheritance versus Composition• Inheritance has been promoted as the reuse mechanism• Experience shows that composition is a cleaner mechanism

– Inheritance hierarchies can become overly complex– Inheritance breaks encapsulation (at least partially)– Inheritance is a static compile-time mechanism, while

composition can be a dynamic run-time mechanism (added flexibility may be good or bad)

– Implementation of parent will affect that of the child

CS351 - Software Engineering (AY2004) Slide 17

Unified Modeling Language (UML)• Previous class diagram notation is part of the Unified Modelling

Language (UML)– arose out of other notations: OMT, Booch, Jacobsen

• UML also addresses other models– Use Case diagrams for capturing external interactions– State diagrams for capturing the internal class activity– Interaction diagrams for capturing interaction between

classes– Sequence diagrams for capturing more detailed interaction

between classes– Deployment diagrams for relating software to available

hardware– ...

CS351 - Software Engineering (AY2004) Slide 18

Beyond objects• Object-oriented software construction is not enough

– Typical systems have a large number of objects/classes– Relationships between classes can be very complex– Becomes unmanageable

• Consider commonly occurring sets of classes — patterns– E.g. contract for house sale speaks in terms of Vendors,

Purchasers, Premises, Chattels, etc.– A set of objects is required for such a contract

CS351 - Software Engineering (AY2004) Slide 19

Beyond patterns• Patterns may not be enough to structure complex software• You may require a higher level view of the system• This leads to the topic of software architecture ...

CS351 - Software Engineering (AY2004) Slide 20

Example: the Adapter (class) pattern• Consider wanting to use a prebuilt component which

does not match the interface you assumed– very common when you try to reuse software

CS351 - Software Engineering (AY2004) Slide 21

Example: the Adapter (class) example

• Consider supplying a bank account (as above) in terms of an account which has a single method for changes

CS351 - Software Engineering (AY2004) Slide 22

Example: the Adapter (object) pattern

• Consider wanting to use a prebuilt component which does not match the interface you assumed

• Adaptee is used, not inherited

CS351 - Software Engineering (AY2004) Slide 23

Example: the Adapter (object) pattern

• Consider needing a bank account (as above) in terms of an account which has a single method for changes.

CS351 - Software Engineering (AY2004) Slide 24

Where next?• Describing and classifying patterns• Creational patterns for more flexible object creation• Reference: Gamma et.al. chapters 3-4

– http://hillside.net/patterns– http://www.cs.wustl.edu/~schmidt/patterns-info.html

CS351 - Software Engineering (AY2004) Slide 25

Reminder• Patterns capture solutions to commonly occurring problems

– Many problems arise in the context of GUIs– Authors need to identify 3 distinct uses/contexts before

classifying the solution as a pattern• Patterns consist of a number of classes which interact in a

certain way (to solve the problem)• Patterns may or may not be applicable in a given context• Many patterns introduce extra levels of indirection

– Most problems in Computer Science can be solved with an extra level of indirection

CS351 - Software Engineering (AY2004) Slide 26

Description of patterns• Name — succinct indication of pattern’s purpose• Synopsis — short description of the pattern (for experienced

users)• Context — problem description + example problem• Forces — considerations leading to the solution• Solution — describes the general-purpose solution• Consequences — trade-offs and results• Implementation — pitfalls, hints, techniques• Sample code• Related patterns — similar sorts of situations

CS351 - Software Engineering (AY2004) Slide 27

Example description – Adapter pattern

• Name: Adapter — Class, Object — Structural• Synopsis: implements an interface known to the clients via a

class which is not known to the clients• Context: the class interfaces derived from the design of a

system may not match the class interface available in a reusable library. E.g. BankAccount class with two methods deposit(amount) and withdraw(amount) to be adapted to a class Account which has a single method change(amount) which accepts positive and negative amounts.

• Forces:– You want to use an existing class, and its interface does not

match the one you need– You do not have the option of changing the interface of the

existing class – maybe the source isn’t available, or the class is part of a reusable library

CS351 - Software Engineering (AY2004) Slide 28

Example description – Adapter pattern

• Solution: A class adapter uses multiple inheritance to adapt one interface to another. An object adapter relies on object composition:– Target defines the domain-specific interface that Client uses– Client collaborates with objects conforming to the Target

interface– Adaptee defines an existing interface that needs adapting– Adapter adapts the interface of Adaptee to the Target

interface

CS351 - Software Engineering (AY2004) Slide 29

Example: the Adapter (class) pattern• Reuse a prebuilt class which does not match the interface you

assumed– very common when you try to reuse software

CS351 - Software Engineering (AY2004) Slide 30

Java-line code for Adapter class pattern

abstract class Target // Maybe an interface{

public abstract ResultType request();…

}class Adaptee // An existing class{

public ResultType req(){…} …

}

CS351 - Software Engineering (AY2004) Slide 31

Java-line code for Adapter class pattern

class Adaptor extends Target, Adaptee{

public ResultType request(){return req(); // Use Adaptee version} …

}• Note that Java does not support multiple inheritance

– the above would be possible in C++, Eiffel– the above would be possible if Target were an interface, in

which case Adaptor would inherit Adaptee and implement Target

CS351 - Software Engineering (AY2004) Slide 32

The Adapter (object) pattern• Consider wanting to use a prebuilt component which does not

match the interface you assumed

CS351 - Software Engineering (AY2004) Slide 33

Java-like code for Adapter object pattern

• Target and Adaptee classes as beforeclass Adaptor extends Target // Does not inherit Adaptee{

Adaptee adpt = new Adaptee();…public ResultType request(){

return adpt.req(); // Use Adaptee version} …

}• Note that this works directly in Java

CS351 - Software Engineering (AY2004) Slide 34

Example description: Adapter pattern

• Consequences: Class and object adapters have different trade-offs. A class adapter– adapts Adaptee to Target by committing to a concrete

Adapter class. As a consequence, a class adapter won’t work when we want to adapt a class and all its subclasses.

– lets Adapter override some of Adaptee’s behaviour, since Adapter is a subclass of Adaptee

– introduces only one object, and no additional pointer indirection is needed to get to the Adaptee.

CS351 - Software Engineering (AY2004) Slide 35

Example description: Adapter pattern

• Consequences: Class and object adapters have different trade-offs. An object adapter– lets a single Adapter work with many Adaptees, i.e. the

Adaptee itself and all of its subclasses (if any). The Adapter can also add functionality to all Adaptees at once.

– makes it harder to override Adaptee behaviour. It will require subclassing Adaptee and making Adapter refer to the subclass rather than the Adaptee itself.

• Related patterns: Facade, Proxy, Strategy

CS351 - Software Engineering (AY2004) Slide 36

Classification of patterns• There are two basic dimensions of classification• Scope:

– application primarily to classes or objects?• Purpose:

– creational — for creating (and deleting) objects– structural — for composing classes or objects– behavioural — interaction of classes or objects

CS351 - Software Engineering (AY2004) Slide 37

Example classification: Adapter pattern

• Adapter is of scope class or object• Adapter is of purpose structural

CS351 - Software Engineering (AY2004) Slide 38

Creational patterns• These patterns provide alternatives to creation of objects by

using the new function which:– fixes the class of object being created

• i.e. lacks flexibility / configurability– is independent of other calls to new

• i.e. does not relate creation of different kinds of objects• Suppose we have a situation where a number of related objects

(or products) need to be created– e.g. set of graphical components with similar look-and-feel– e.g. set of bank accounts with matching audit provisions

• A common problem!

CS351 - Software Engineering (AY2004) Slide 39

Abstract factory – object creational• Synopsis: Provides a way to create instances of abstract

classes from a matched set of concrete subclasses• Context: Consider building a GUI framework which should work

with multiple windowing systems (e.g. Windows, Motif, MacOS) and should provide consistent look-and-feel.

• Forces: Use the Abstract Factory pattern when:– a system should be independent of how its products are

created, composed and represented– a system should be configured with one of multiple families

of products– a family of related products is designed to be used together,

and you need to enforce this constraint– you want to provide a class library of products, and only

reveal their interfaces, not their implementations

CS351 - Software Engineering (AY2004) Slide 40

Abstract factory – object creational• Solution: Define an abstract factory class which has methods to

generate the different kinds of products. (For a windowing system this could generate matched buttons, scroll bars, fields). The abstract factory is subclassed for a particular concrete set of products– AbstractFactory – declares an interface for operations that

create abstract product objects– ConcreteFactory – implements the operations to create

concrete product objects– AbstractProduct – declares an interface for a type of product

object– ConcreteProduct – implement the AbstractProduct interface– Client – uses only the interfaces declared by

AbstractFactory and AbstractProduct classes

CS351 - Software Engineering (AY2004) Slide 41

Abstract factory – object creational

CS351 - Software Engineering (AY2004) Slide 42

Abstract factory – object creational• Consequences:

– It isolates concrete classes• clients are isolated from implementation classes• clients manipulate instances through their abstract

interfaces– It makes exchanging product families easy– It promotes consistency among products– Supporting new kinds of product is difficult

• the AbstractFactory interface fixes the set of products that can be created

• extending the AbstractFactory interface will involve changing all of the subclasses

– The hierarchy of products is independent of the client

CS351 - Software Engineering (AY2004) Slide 43

Lexi: consistent look-and-feel

CS351 - Software Engineering (AY2004) Slide 44

Java code for Abstract Factory pattern

abstract class Product1 // Some kind of object{

…}abstract class Product2 // Another kind of object{ // - related to Product1

…}abstract class AbstractFactory{

public abstract Product1 createProduct1();public abstract Product2 createProduct2();…

}

CS351 - Software Engineering (AY2004) Slide 45

Java code for Abstract Factory patternclass version1Product1 extends Product1 // Specific kind{ // of Product1

…}class version1Product2 extends Product2 // Specific kind{ // of Product2

…}class version2Product1 extends Product1 // Another kind{ // of Product1

…}class version2Product2 extends Product2 // Another kind{ // of Product2

…}

CS351 - Software Engineering (AY2004) Slide 46

Java code for Abstract Factory pattern

class version1Factory extends AbstractFactory{ // Factory for version1 products

public Product1 createProduct1(){

return new version1Product1();}public Product2 createProduct2(){

return new version1Product1();}…

}• Similarly for a class version2Factory

CS351 - Software Engineering (AY2004) Slide 47

Java code for Abstract Factory pattern

class client{

static void main(){

AbstractFactory fact = new version1Factory();…... fact.createProduct1() // version1 products... fact.createProduct2()

}…

}• With the one line fact = new version2Factory(), you would end

up with version2 products

CS351 - Software Engineering (AY2004) Slide 48

Creational patterns• In the abstract factory the family of related products was

independent of the client(s)• A GUI framework needs to generate related products, but the

products depend on the structure of the client classes– e.g. a word-processor application needs to generate word-

processor documents, and word-processor documents need to be displayed in word-processor views

• Solution is to define methods in the (generic) client classes to create (generic) objects– then override these methods in a specific application

CS351 - Software Engineering (AY2004) Slide 49

Sample: generic application and documents

CS351 - Software Engineering (AY2004) Slide 50

Factory method – class creational• Synopsis: Define an interface for creating an object, but let

subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses

• Context: Example is that of a GUI framework. The generic Application class will have a method createDocument to create a generic document. A specific use of the framework for, say, word-processing GUI would subclass the generic Application class and override the createDocument method to generate word-processing documents.

• Forces: Use the Factory Method pattern when:– a class can’t anticipate the class of objects it must create– a class wants its subclasses to specify the objects it creates– the set of classes to be generated may be dynamic

CS351 - Software Engineering (AY2004) Slide 51

Factory method – class creational• Solution: Use a factory method to create the instances:

– Product (e.g. Document) – defines the interface of objects the factory method creates

– ConcreteProduct (e.g. MyDocument) – implements theProduct interface

– Creator (e.g. Application) – declares the factory method which returns an object of type Product (possibly with a default implementation); may call the factory method to create a Produce object

– ConcreteCreator (e.g. MyApplication) – overrides the factory method to return an instance of ConcreteProduct

CS351 - Software Engineering (AY2004) Slide 52

Factory method – class creational

CS351 - Software Engineering (AY2004) Slide 53

Factory method – class creational• Consequences:

– It eliminates the need to bind application-specific classes into your code. The code only deals with the Product interface and therefore can work with any user-defined ConcreteProduct classes.

– A client will have to subclass the Creator class just to create a particular ConcreteProduct instance.

– Provides hooks for subclasses to provide extended versions of objects

– Connects parallel class hierarchies, e.g. Application – Document versus MyApplication – MyDocument

– The set of product classes that can be instantiated may change dynamically

CS351 - Software Engineering (AY2004) Slide 54

Structural patterns• Reference: Gamma et al.: Chapter 4.• These patterns allow you to achieve different relationships

between classes or objects– Adapter is a structural pattern

• Consider a situation where you have some recursive composition of objects– e.g. consider a document formatting program that formats

characters into lines, lines into columns, columns into pages– suppose that columns can contain frames which can contain

columns– the recursive structure can get rather complicated

CS351 - Software Engineering (AY2004) Slide 55

Structural patterns

CS351 - Software Engineering (AY2004) Slide 56

Composite – object structural• Synopsis: Allows you to build complex objects by recursively

composing similar objects in a treelike manner, representing whole-part hierarchies

• Context: In a document-formatting program (such as described previously), the complex inclusion relationships can lead to complex code. This is made worse if you try to handle primitive and container objects differently. The key to the pattern is to define an abstract class which represents both primitive and composite components

• Forces:– you have a complex object that needs to be decomposed

into a part-whole hierarchy– you want to minimise the complexity of the part-whole

hierarchy by minimising the number of different kinds of child objects

CS351 - Software Engineering (AY2004) Slide 57

Composite - object structural• Solution: Provide an abstract superclass for all objects in the

hierarchy and an abstract superclass for all composites in the hierarchy– AbstractComponent – the common superclass for all objects

in the hierarchy– AbstractComposite – the common superclass for all

composite objects in the hierarchy. It inherits from AbstractComponent and has additional methods to add and remove components

– ConcreteComponent – specific component in the hierarchy– ConcreteComposite – specific composite in the hierarchy

CS351 - Software Engineering (AY2004) Slide 58

Composite – object structural

CS351 - Software Engineering (AY2004) Slide 59

Composite – object structural• Consequences:

– The tree-like composite object can be treated as consisting of AbstractComponents (whether they are simple or composite)

– Clients of AbstractComponent can ignore whether it is actually a composite or not

– An operation performed on an AbstractComposite treated as an AbstractComponent can be delegated to the component objects

– Any AbstractComponent object can be a child of an AbstractComposite. More restrictive policies can be enforced.

• Related patterns: Chain of responsibility

CS351 - Software Engineering (AY2004) Slide 60

Composite – object structural

CS351 - Software Engineering (AY2004) Slide 61

Glyph interface for Lexi• All graphics, whether simple or composite, will have a common

interface of a Glyph:

interface Glyph {void Draw(Window) // to display itselfRect Bounds() // return the bounding rectangleBoolean Intersects(Point) // determine if the point is in the

// bounding rectangle (and the glyph

// needs to respond to some event)void Insert(Glyph, int) // add a component glyphvoid Remove(Glyph) // remove a glyphGlyph Child(int) // return a component glyphGlyph Parent() // return the parent glyph

}

CS351 - Software Engineering (AY2004) Slide 62

Structural patterns• Consider a situation where you want to control access to an

object– e.g. a distributed system where the application needs to

interact with an object but it should not need to know whether the object is local or remote

– e.g. a word processor where you do not wish to open and display a (large) image unless it is required

CS351 - Software Engineering (AY2004) Slide 63

Example- text document with large images

CS351 - Software Engineering (AY2004) Slide 64

Proxy – object structural• Synopsis: Provide a surrogate or placeholder for another object

to control access to it• Context: A proxy object receives method calls from clients on

behalf of another object. The proxy object does not provide the services directly but calls the methods of the object. Proxy is applicable whenever there is a need for a more versatile or sophisticated reference to an object than a simple pointer, such as:– a remote proxy provides a local representative for an object

in a different address space– a virtual proxy creates expensive objects on demand– a protection proxy controls access to the original object– a smart reference is a replacement for a bare pointer that

performs additional actions when an object is accessed

CS351 - Software Engineering (AY2004) Slide 65

Proxy – object structural• Forces:

– the service-providing object cannot provide the service at a convenient time and place

– gaining visibility to an object is non-trivial and you want to hide the complexity

– you want to control access to the service-providing object

CS351 - Software Engineering (AY2004) Slide 66

Proxy – object structural• Solution: Proxy forwards requests to RealSubject when

appropriate, depending on the kind of proxy– Subject (e.g. Graphic) – defines the common interface for

RealSubject and Proxy so that Proxy can be used anywhere that RealSubject is expected

– RealSubject (e.g. Image) – defines the real object that the proxy represents

– Proxy (e.g. ImageProxy) – maintains a reference that lets the proxy access the real subject; provides an interface identical to Subject’s so that a proxy can be substituted for the real subject; controls access to the real subject

CS351 - Software Engineering (AY2004) Slide 67

Proxy – object structural

CS351 - Software Engineering (AY2004) Slide 68

Proxy – object structural• Consequences:

– The additional level of indirection in accessing an object can have many uses:

• a remote proxy can hide the fact that an object resides in a different address space

• a virtual proxy can perform optimisations such as creating an object on demand

• protection proxies and smart references allow additional housekeeping tasks when an object is accessed

– A Proxy can also be used to defer duplication of a (large) object until the duplicate is actually changed (and the copy needs to be generated)

• Related patterns: Facade, Decorator

CS351 - Software Engineering (AY2004) Slide 69

Structural patterns• Consider a situation where you want to vary the implementation

of an abstraction at run time– e.g. given a fixed GraphBase you may want to vary the

GraphImp at run-time (to suit particular algorithms)• Consider a situation where you want to allow a number of

related abstractions each with a number of different implementations– it is then desirable for the abstractions and implementations

to vary independently

CS351 - Software Engineering (AY2004) Slide 70

Example – variety of windows and systems

CS351 - Software Engineering (AY2004) Slide 71

Bridge – object structural• Synopsis: Decouple an abstraction from its implementation so

that they can vary independently• Context: You can have hierarchies of windowing abstractions

and hierarchies of windowing systems. If you combine the two, you will end up with too many classes.

• Forces:– you want to avoid a permanent binding between an

abstraction and its implementation– both the abstractions and the implementations should be

extensible by subclassing– changes in the implementation of an abstraction should have

no impact on clients– you have a proliferation of classes (as in the example)– you want to share an implementation among multiple objects

CS351 - Software Engineering (AY2004) Slide 72

Bridge – object structural• Solution: Abstractions have reference to the implementation and

forward client requests as required– Abstraction (e.g. Window) – defines the abstraction’s

interface; maintains a reference to an object of type Implementor

– RefinedAbstraction (e.g. IconWindow) – extends the interface defined by Abstraction

– Implementor (e.g. WindowImp) – defines the interface for the implementation classes. This interface doesn’t need to correspond exactly to the Abstraction’s interface (but it may)

– ConcreteImplementor (e.g. XWindowImp) – implements the Implementor’s interface

CS351 - Software Engineering (AY2004) Slide 73

Bridge – object structural

CS351 - Software Engineering (AY2004) Slide 74

Example – variety of windows and systems

CS351 - Software Engineering (AY2004) Slide 75

Bridge – object structural• Consequences:

– Decoupling abstraction and implementation:• an implementation is not bound permanently to a

abstraction• eliminates compile-time dependencies on the

implementation, i.e. can change implementation class without necessarily recompiling

– Improved extensibility:• the Abstraction and Implementation hierarchies can be

extended independently– Hiding implementation details from clients:

• e.g. clients don’t need to know if implementations are shared

• Related patterns: Adapter, Factory method

CS351 - Software Engineering (AY2004) Slide 76

Where next?• Structural patterns for more flexible object relationships

– Decorator• Behavioral patterns for more flexible object interaction

– Strategy– Iterator

• Reference:, Gamma et.al. chapter 5– http://hillside.net/patterns– http://www.cs.wustl.edu/~schmidt/patterns-info.html

CS351 - Software Engineering (AY2004) Slide 77

Structural patterns• Sometimes you want to add capabilities/responsibilities to an

individual object and not to a whole class– e.g. you may want to display some objects in a GUI with

embellishments like a border or drop shadow– e.g. you may want to add scroll bars to a component only

when it cannot be fully displayed in the window• Using inheritance to add the capability means that all objects

will have the additional properties (e.g. border)• Another approach is to define a class to act as a filter:

– it encloses the object to be embellished– it adds the capability required– such a filter can be added as required

CS351 - Software Engineering (AY2004) Slide 78

Decorator – object structural• Synopsis: Add functionality (dynamically) to an object in a way

which is transparent to its clients• Context: In a GUI, you may want to add and retract

embellishments of displayed objects, such as a border or shading or some highlight. It is not appropriate to add this to every displayed object, and further, you may wish to retract the embellishment without discarding the original object.

• Forces:– You want to extend the functionality of a number of objects

of a given class, but you do not want to add this to every instance

– There is a need to dynamically extend or withdraw the capabilities of objects

CS351 - Software Engineering (AY2004) Slide 79

Decorator – object structural• Solution: Define a class to act as a wrapper/filter for the original

object and which adds the necessary functionality. Such a wrapper instance can be added or removed at runtime.– Component — defines the interface for objects which can

have capabilities added dynamically– ConcreteComponent — defines the objects to which

additional capabilities can be attached– Decorator — includes the Component interface, holds a

reference to a component– ConcreteDecorator — adds the required capabilities to a

Decorator

CS351 - Software Engineering (AY2004) Slide 80

Decorator – object structural

CS351 - Software Engineering (AY2004) Slide 81

Decorator – object structural• Consequences:

– Decorator allows for dynamic change in the capabilities of components, by adding and removing wrappers

– You can mix and match with a number of wrappers achieving a large number of possible combinations

– Flexibility of wrappers makes them more error prone, e.g. using incompatible wrappers or getting circular references

– Use of decorators reduces the number of classes, but increases the number of objects (which can hinder debugging)

– The use of decorators makes it difficult to distinguish objects by their object identities

• Related patterns: Delegation, Filter, Strategy

CS351 - Software Engineering (AY2004) Slide 82

Behavioral patterns• Consider a system that needs to break a stream of text into

lines. There are many algorithms for doing this – hardwiring a particular algorithm may be undesirable:– clients will be more complex if they include the algorithm– different algorithms will be appropriate at different times or in

different contexts– it is difficult to add new algorithms

• The solution is to define classes which encapsulate different line-breaking algorithms– the so-called Strategy pattern

CS351 - Software Engineering (AY2004) Slide 83

Strategy – object behavioral• Synopsis: Define a family of algorithms, encapsulate each one,

and make them interchangeable. Strategy lets the algorithm vary independently from clients that use it

• Context: In a document editor you may want to vary the choice of line-breaking strategies, possibly on-the-fly

• Forces: Use the Strategy pattern when:– many related classes differ only in their behavior, in which

case the Strategy provides a way of configuring a class with one of many behaviors

– you need different variants of an algorithm– an algorithm uses data that clients shouldn’t know about –

Strategy avoids exposing complex, algorithm-specific data structures

– a class defines multiple alternative behaviors

CS351 - Software Engineering (AY2004) Slide 84

Strategy – object behavioral• Solution: Encapsulate the algorithm in an object:

– Strategy (e.g. Compositor) – declares an interface common to all supported algorithms. Context uses this interface to call the algorithms defined by a ConcreteStrategy

– ConcreteStrategy (e.g. SimpleCompositor) – implements the algorithm using the Strategy interface

– Context (e.g. Composition) – is configured with a ConcreteStrategy object, and may define an interface that lets Strategy access its data.

CS351 - Software Engineering (AY2004) Slide 85

Structural of strategy pattern

CS351 - Software Engineering (AY2004) Slide 86

Example: breaking test into lines

• Composition maintains line breaks in displayed text – it uses a Compositor to determine those line breaks

• Compositor determines line breaks – SimpleCompositor for plain text, TexCompositor for Tex algorithm, etc.

CS351 - Software Engineering (AY2004) Slide 87

Strategy – object behavioral• Consequences: The Strategy pattern has the following benefits

and drawbacks:– families of related algorithms can be defined using a class

hierarchy, thus allowing common functionality of the algorithms to be factored out

– an alternative to subclassing for providing a variety of algorithms or behaviours. Subclassing for modifying behaviour hard-wires the behaviour into Context. Further, subclassing does not support dynamic modification of the algorithm

– Strategies can eliminate conditional statements used to select the particular algorithm

– Strategies provide a choice of implementations, depending for example, on different time and space tradeoffs

CS351 - Software Engineering (AY2004) Slide 88

Strategy – object behavioral• Consequences: The Strategy pattern has the following benefits

and drawbacks:– families of related algorithms can be defined using a class

hierarchy, thus allowing common functionality of the algorithms to be factored out

– an alternative to subclassing for providing a variety of algorithms or behaviours. Subclassing for modifying behaviour hard-wires the behaviour into Context. Further, subclassing does not support dynamic modification of the algorithm

– Strategies can eliminate conditional statements used to select the particular algorithm

– Strategies provide a choice of implementations, depending for example, on different time and space tradeoffs

CS351 - Software Engineering (AY2004) Slide 89

Behavioral patterns• Suppose we have an aggregate data structure and we wish to

access the components without revealing the structure of the aggregate– e.g. it would be nice to be able to write something like:

for (Iterator i = s.iterator() i.hasNext();) {

x=i.next();

...– e.g. we may have a Set data structure and wish to examine

the elements of the set without revealing whether they are stored as an array, linked list, etc.

– Solution is to define an Iterator

CS351 - Software Engineering (AY2004) Slide 90

Iterator – object behavioral• Synopsis: Provide a way to access the elements of an

aggregate object sequentially without exposing its underlying representation

• Context: useful for accessing the components of any data structure, e.g. set, list, tree

• Forces: Use the Iterator pattern:– to access an aggregate object’s contents without exposing

its internal representation– to support multiple traversals of aggregate objects– to provide a uniform interface for traversing different

aggregate structures (i.e. to support polymorphic iteration)

CS351 - Software Engineering (AY2004) Slide 91

Iterator – object behavioral• Solution:

– Iterator – defines an interface for accessing and traversing elements

– ConcreteIterator (e.g. PTListIterator) – implements the Iterator interface; keeps track of the current position in the traversal of the aggregate

– Aggregate – defines an interface for creating an Iterator object

– ConcreteAggregate (e.g. PTList) – implements the Iterator creation interface to return an instance of the proper ConcreteIterator

CS351 - Software Engineering (AY2004) Slide 92

Example: a list iterator

• PTListIterator will need to have a reference to the list (as indicated by the arrow in the diagram)

• For scoping reasons (in Java), the PTListIterator will be declared as a public inner class of PTList—only then will the hidden components of PTList be accessible to the iterator, cf. friend in C++

CS351 - Software Engineering (AY2004) Slide 93

Iterator – object behavioral• Consequences: There are 3 important consequences:

– It supports variations in the traversal of an aggregate. Complex data structures may be traversed in many ways. Different iterators can be defined for different kinds of traversal

– Iterators simplify the Aggregate interface. The Aggregate does not need to supply extra functions for iteration, since they are now available in a separate class.

– More than one traversal can be pending on an aggregate. This is because each iterator keeps track of its own traversal state. The same effect would be more difficult if the aggregate stored the traversal state.

– You should query the robustness of the iterator – what happens if the aggregate is changed during traversal?

CS351 - Software Engineering (AY2004) Slide 94

Java code for an iterator• Code added to the PTSet classimport java.util.Iterator;import java.util.Set;class PTSet implements Set { // class definition

…public class ElementIterator implements Iterator {

// use the Iterator interfaceint currelt = 0;public boolean hasNext() { // part of the Iterator

interfacereturn currelt < numElements();

}public Object next() { // part of the Iterator interface

Object result = null; // result will require coercion

if (hasNext()) {result = item(currelt);currelt = currelt+1;

}return result;

}}public Iterator iterator() { // function to create an iterator

return new ElementIterator();}

}

Generate iterator

Use iteratorInterface of Java

CS351 - Software Engineering (AY2004) Slide 95

Java code for an iterator• Code added to the client classimport java.util.Iterator;

class Client { // class definition for some client

PTSet s = new PTSet(); // will process elements of set s

for (Iterator iter = s.makeElementIterator(); iter.hasNext(); ) { // generate the iterator

Element e=(Element)iter.next();

…}

}

CS351 - Software Engineering (AY2004) Slide 96

Behavioral patterns• In a GUI, it is common to support undoable operations

– you choose a graphical component and perform some operation on it

– After that you wish to be able to undo/redo it• Alternatively, you may wish to have the facility for queuing

operations, or scheduling them for later execution.• The common way to support this functionality is with the

Command pattern

CS351 - Software Engineering (AY2004) Slide 97

Command – object behavioral• Synopsis: Encapsulates a request as an object, thereby letting

you parameterise clients with different requests, queue or log requests, and support undoable operations

• Context: support for undoable commands such as Cut, Copy and Paste in a GUI.

• Forces: Use the Command pattern when you want to:– parameterise objects by an action to perform. (Commands

are an object-oriented replacement for callbacks in procedural languages.)

– specify, queue, and execute requests at different times. The Command object can have a lifetime independent of the original request

– support undo, since a Command can store relevant state for reversing the effects of the command

CS351 - Software Engineering (AY2004) Slide 98

Command – object behavioral• Forces (ctd): Use the Command pattern when you want to:

– support logging changes so that they can be reapplied in case of a system crash

– structure a system around high-level operations built on primitive operations. Such a structures is common in information systems that support transactions. A transaction encapsulates a set of changes to data. The Command pattern offers a way to model transactions.

CS351 - Software Engineering (AY2004) Slide 99

Command – object behavioral• Solution: The requested operation is encapsulated in an object

with sufficient data to be able to perform and undo it:– Command – declares an interface for executing an operation– ConcreteCommand (e.g. PasteCommand) – defines a

binding between a Receiver object and an action; implements commit() by invoking the corresponding operation(s) on Receiver

– Client (e.g. Application) – creates a ConcreteCommand object and sets its Receiver

– Invoker (e.g. MenuItem) – asks the command to carry out the request

– Receiver (e.g. Document) – knows how to perform the operations associated with carrying out a request

CS351 - Software Engineering (AY2004) Slide 100

Structure of command pattern

CS351 - Software Engineering (AY2004) Slide 101

Example: GUI commands

CS351 - Software Engineering (AY2004) Slide 102

Command – object behavioral• Consequences:

– Command decouples the object that invokes the operation from the one that knows how to perform it

– Commands are first-class objects – they can be manipulated and extended like any other object

– You can assemble commands into a composite command– You can add new commands without changing existing

classes• Related patterns: Strategy

CS351 - Software Engineering (AY2004) Slide 103

Motivating example for design patterns

• Graphical user interfaces (GUIs) are quite pervasive– they are complex pieces of software– their development relies heavily on object-orientation

• Much of the initial motivation for design patterns arose in the context of GUI development– no coincidence that Gamma developed key GUI frameworks– there are common problems in the GUI context– there are standard solutions – design patterns

• A GUI case study provides the context for demonstrating a number of design patterns

CS351 - Software Engineering (AY2004) Slide 104

Essential features of a GUI• Graphical display

– windows– icons– menus

• User interaction via pointing device (mouse) + keyboard– select window, navigate within a window– select object as target for operation– select operation via menus (or keyboard)

• Event-driven paradigm– activity is determined by user interaction, not predetermined

by program

CS351 - Software Engineering (AY2004) Slide 105

Event-driven paradigm• Typically GUI style program

– read a graph if the user selects appropriate menu item– modify display of graph in response to mouse activity– perform analysis in response to menu item– produce results if requested

• Structure of program is based around a central event loop– repeatedly wait for an event and then process it

CS351 - Software Engineering (AY2004) Slide 106

Requirements for a document editor• A significant design problem

– What are the issues to be addressed?– Can we formulate the “big picture”?– How effective are patterns for capturing the design choices?

• Document editor (called Lexi) in the style of Word, etc.– Documents consist of text + graphics– Manipulate individual or groups of components– See fig 2.1 (Gamma et al) for sample screen image

• Want flexibility in many areas– structure, algorithms, interface

CS351 - Software Engineering (AY2004) Slide 107

Design issues• Document structure

– flexible composition of document components• Formatting

– flexible, configurable formatting policies• Embellishing the user interface

– scroll bars, borders, drop shadows, etc.• Multiple look-and-feel standards

– can’t be hard-wired into the application• Multiple windowing systems for portability• User operations which are undoable• Spell checking and hyphenation

– won’t be considered

CS351 - Software Engineering (AY2004) Slide 108

Document structure• A document consists of graphical components such as

characters, lines, polygons, other shapes• The author will view the document as groups of components

rows, columns, figures, tables, etc.– Lexi should allow the author to manipulate these groups

directly• The internal document structure should support:

– maintaining the document’s physical structure– generating and presenting the document visually– mapping positions on the display to document components

(in response to mouse activity)

CS351 - Software Engineering (AY2004) Slide 109

Document structure• Proposal is to have a recursive structure for graphical

components

CS351 - Software Engineering (AY2004) Slide 110

Document structure• Internal structure corresponding to previous slide will be tree-

structured:

CS351 - Software Engineering (AY2004) Slide 111

Formatting strategies• Variety of issues could be addressed

– e.g. how to break up the components into lines– what are the formatting policies?– can they be configured on demand?

• Want to support a variety of strategies independent of the document structure

CS351 - Software Engineering (AY2004) Slide 112

Embellishing the user interface• Want to support scroll bars, borders, etc.• Want to be able to do this uniformly and flexibly

– vary these as the user interface evolves– even add and remove them on the fly– therefore can’t have a fixed inheritance structure

• Set up a structure for transparent enclosures (like a filter)– each enclosure has one component– drawing interface is the same as for the component– clients don’t know if they are dealing with the component or

the enclosure

CS351 - Software Engineering (AY2004) Slide 113

Multiple look-and-feel standards• Look-and-feel is determined by a family of GUI components

– buttons, scroll bars, pop-up menus, etc.– called widgets

• Need to be able to generate consistent sets of widgets– suit a variety of styles, e.g. Motif, Windows, MacOS, …

CS351 - Software Engineering (AY2004) Slide 114

Multiple windowing systems• Want to support multiple window systems for portability

– these vary in the level of functionality– should we define an abstract windowing system and then

inherit it and override it to satisfy specific cases?– support the minimum functionality? maximum?

• Simpler to define a windowing system that suits our needs– allow this to have a variety of implementations– each implementation decides how to implement the required

operations

CS351 - Software Engineering (AY2004) Slide 115

Undoable operations• User can request operations from different contexts

– menu selection– mouse operation– palette

• Request need to encapsulate relevant state information so that they can be undone

CS351 - Software Engineering (AY2004) Slide 116

GUI frameworks• Even with object orientation, developing a GUI is hard work

– learning curves of 18 months used to be quoted– Java APIs make it a lot easier

• Significant breakthrough came with GUI frameworks– “A framework is a set of cooperating classes that make up a

reusable design for a specific class of software”– It is a skeleton application which can be refined by

inheritance– There are frameworks for GUIs, compiler construction,

financial modelling

CS351 - Software Engineering (AY2004) Slide 117

GUI frameworks• A GUI framework will include:

– generic application which will include the central event loop– central event loop will distribute events to relevant graphical

components– generic documents = file with contents displayed in a

window– generic windows with title bar, close box, resize control,

scroll bar– generic dialog windows with the ability to display check

boxes, radio controls, buttons, etc.– configurable menu manipulation

CS351 - Software Engineering (AY2004) Slide 118

Generic application• The Generic Application is typically encoded in a class called

Application– this class is subclassed for a specific application

• The Application class typically:– includes the central event loop which is never modifiable– is instantiated once for a given run of the application– may handle multiple document types– has method(s) to generate documents– has method(s) to setup and respond to appropriate menus

CS351 - Software Engineering (AY2004) Slide 119

Generic document• The Generic Document is typically encoded in a class called

Document– this class is subclassed for different specific documents

• The Document class typically:– is instantiated once per document to be processed– has methods for fetching and storing the document as a file– has method(s) to display the document contents– has method(s) to setup and respond to appropriate menus

CS351 - Software Engineering (AY2004) Slide 120

Generic view• The Generic View is typically encoded in a class called View

– this class is subclassed for different specific graphical components

• The View class typically:– corresponds to an arbitrarily large drawing surface– contains functionality to render and print the component– contains functionality to maintain the current selection– supports various possible representations of the same data,

e.g. spreadsheet, graph, etc.– has method(s) to respond to mouse events

CS351 - Software Engineering (AY2004) Slide 121

Generic window• The Generic Window is typically encoded in a class called

Window– this class is subclassed for different operating systems

• The Window class typically:– implements window-related methods like moving, resizing,

closing– contains methods to optimise screen updating– may contain components to clip the display

• Note that a View is a logical entity which is displayed in the physical entity of a Window

CS351 - Software Engineering (AY2004) Slide 122

Generic classes and relationships• Application has multiple documents

• Document has multiple views

• View is displayed in a physical region

• Window contains multiple regions

CS351 - Software Engineering (AY2004) Slide 123