21
S D 1 Fundamental Design Patterns

Fundamental Design Patterns

Embed Size (px)

DESCRIPTION

Fundamental Design Patterns. Fundamental Design Patterns. Delegation—when not to use Inheritance Interface Abstract superclass (not covered here) Interface and abstract class (not covered here) Immutable Marker interface Proxy (not covered here). Delegation. Intent - PowerPoint PPT Presentation

Citation preview

SD

1

FundamentalDesign Patterns

SD

2

Fundamental Design Patterns

• Delegation—when not to use Inheritance

• Interface

• Abstract superclass (not covered here)

• Interface and abstract class (not covered here)

• Immutable

• Marker interface

• Proxy (not covered here)

SD

3

Delegation

• Intent> A way to extend and reuse functionality of a class by writing

an additional class with added functionality that uses instances of the original class to provide the original functionality.

• Motivation> Inheritance is a common way to extend & reuse functionality.

° Usually is-a-kind-of (Specialization)

> Inheritance is inappropriate for many situations:

° is-a-role-played-by ?

> Delegation is a more general way for extending a class’s behavior.

• Applicability> Use the Delegation pattern when

° Behavior might change over time.

° Not conceptually an inheritance relationship.

SD

4

• Structure

• Participants> Delegator

° declares interface for clients.

° delegates messages to Delegate.

> Delegate

° answers to messages sent by the Delegator.

° may be shared.

• Collaborations° Clients use the Delegator interface to send messages to

the Delegator, as a side effect, the same message is sent to the Delegate by the Delegator.

Delegation (cont’)

Delegator Delegate1 1

user usee

Uses ►

SD

5

Delegation (cont’)

• Consequences> Advantages:

° Can be used without the problems that accompany inheritance.

• e.g. Sub-typing

° Easy to compose behavior at runtime.

> Disadvantages:

° Less structured than inheritance.

° Relationship between classes less obvious.

• Implementation> The implementation of delegation is very

straightforward.

SD

6

Delegation (cont’)

• Sample Code> consider the FlightSegment and LuggageCompartment

classes:

Class FlightSegment {…

LuggageCompartment luggage;…

void checkLuggage(Luggage piece) throws LuggageException {luggage.checkLuggage(piece);

}}

Class LuggageCompartment {…

// The pieces of luggage in this LuggageCompartmentprivate Vector pieces = new Vector();

…void checkLuggage(Luggage piece) throws LuggageException {

…pieces.addElement(piece);

}}

SD

7

Delegation (con’t)

• Related Patterns> Almost every other pattern uses delegation. Some of the

patterns that rely most clearly on delegation are the Decorator pattern and the Proxy pattern.

SD

8

Interface

• Intent> Keep a class that uses data and services provided by

instances of other classes independent of those classes by having those instances through an interface.

• Motivation> Capture common behavior semantics

° e.g. Glyphs, e-mail entities on msOutlook

> Assists “Programming in the large”

° commit to a set of interfaces and their semantics between software teams.

• Applicability> Use the Interface pattern when

° Common behavior may have different implementations.

° Business protection issues - not reveal actual code.

SD

9

• Structure

• Participants> Client

° uses Service classes that implement IndirectionIF.

> IndirectionIF

° provides the indirection that keeps the Client class independent of the Service class.

> Service

° provides a service to Client classes by implementing the IndirectionIF interface

• Collaborations° Clients use the interface to interact with different service objects

which are instances of different classes which are guaranteed to implement the interface.

Interface (cont’)

Client<<interface>>IndirectionIF1 1

Uses ►Service

SD

10

Interface (cont’)

• Consequences> Advantages:

° keeps a class that needs a service from another class from being coupled to any specific class.

> Disadvantages:

° like any other indirection, the interface pattern can make a program more difficult to understand.

• Implementation> The implementation of an interface in Java is very

straightforward.

> In C++, you can write a pure abstract class and supply no method implementation

° use virtual type methodName(args) = 0;° however, the compiler won’t check that you didn’t

actually supply an implementation.

SD

11

Interface (cont’)

• Sample Code> consider the AddressPanal, AddressIF and

ReceivingLocation classes:

Class AddressPanel extends Panel {private AddressIF data;

…public void save() {

if (data != null) {data.setAddress(addressField.getText());

…data.setPostalCode(postalCodeField.getText());}

}}

Public interface AddressIF {public String getAddress();public void setAddress(String address);

…public String getPostalCode();public void setPostalCode(String postalCode);

}

SD

12

Interface (con’t)

• Implementation (cont’)

• Related Patterns> The delegation and interface patterns are often used

together.

> many other patterns use the interface pattern.

Class ReceivingLocation extends Facility implements AddressIF {private String address_;private String postalCode_;

…public String getAddress() { return address_; }public void setAddress(String address) {

address_ = address;}

…public String getPostalCode() { return postalCode_; }public void setPostalCode(String postalCode) {

postalCode_ = postalCode;}

}

SD

13

Immutable

• Intent> Increase the robustness of objects that share references

to the same object and reduce overhead of concurrent access to an object. It accomplishes this by forbidding any of the object’s state information to change after the object is constructed.

• Motivation> const-correctness is invaluable.

> avoid synchronization issues.

• Applicability> Use the Immutable pattern when

° an object isn’t suppose to change state during it’s lifetime.

See also: http://renaud.waldura.com/doc/java/final-keyword.shtml#immutable

SD

14

• Structure

• Participants> Immutable

° allows modification of state variables only upon creation.

° provides access methods for exposed state variables.

° may provide other services.

• Collaborations° Clients use the interface to interact with different service

objects which are instances of different classes which are guaranteed to implement the interface.

Immutable (cont’)Immutable

<<constructor>>Immutable<<misc>>getAttribute1getAttribute2...

Java’s String Class is Immutable

SD

15

Immutable (cont’)

• Consequences> Advantages:

° there is no need to write code to manage state changes.

° no need to synchronize threads that access immutable objects.

> Disadvantages:

° operations that would otherwise have changed the state of an object must create a new object.

• Implementation° no method other than the constructor should modify the

values of a class’s instance variables.

° any method that computes new state information must store that information in a new instance of the same class, rather then modify the existing object’s state.

SD

16

Immutable (cont’)

• Sample Code> consider the Position class

• Related Patterns> Single threaded execution pattern - can be avoided by using the

Immutable pattern.

Class Position {private int x_;private int y_;

public Position(int x, int y) {x_ = x;y_ = y;

}

public int getX() { return x_; }

public int getY() { return y_; }

public Position offset(int xOffset, int yOffset) {return new Position(getX()+xOffset,getY()+yOffset);

}}

SD

17

Marker Interface

• Intent> Use interfaces that declare no methods or variables to

indicate semantic attributes of a class.

° Say that classes implement an interface (with no methods) as the semantic flag/tag

• Motivation> unrelated concepts do have something in common

° Serializable,Cloneable

> however, how to use this information is context-dependent

• Applicability> Use the Marker Interface pattern when

° as intent states - to indicate a semantic attribute.

SD

18

• Structure

• Participants> MarkerIF

° marks descendants for a certain mark

> Marked

° may be passed to Utility

° supports some thing it chose to be marked with.

> Utility

° queries objects for MarkerIF interface and if so uses this information.

> Unmarked

° can be passed to Utility but doesn’t comply to MarkerIF consequences.

Marker Interface (cont’)<<interface>>

MarkerIF

Operation(:object)

Utility

Marked

UnmarkedRecognizes ►

SD

19

Marker Interface (cont’)

• Collaborations° Clients query if a given object is an instance of the

marker interface. This works because inheritance is also sub-typing.

• Consequences> Advantages:

° utility classes are able to make some inferences about objects passed to their methods without depending on the objects to be instances of any particular class.

° The relationship between the utility class and the marker interface is transparent to all other classes except for those classes that implement the interface.

> Disadvantages:° uses Run-Time Type Identification(RTTI) which is

discouraged as bad design. However, in rare cases this can’t be avoided.

SD

20

Marker Interface (cont’)

• Implementation> in Java, use the instanceof keyword to find out if an

object is an instance of a class that is marked by the marker interface.

° For example, ObjectOutputStream refuses to serialize objects unless their class implements serializable (indicating serialization is allowed)

> In C++, use dynamic_cast<marker_interface_name>.

> In Smalltalk, use isKindOf: marker_interface_name

SD

21

Marker Interface (cont’)

• Sample Code> consider a LinkedList implementation

• Related Patterns> the Snapshot pattern uses a marker interface to allow

serialization of objects.

public class LinekedList implements Cloneable, java.io.Serializable {…

public LinkedList find(Object target) {if (target == null || tagrget instanceof EqualByIdentity)

return findEq(target);else

return findEquals(target);}

private synchronized LinkedList findEq(Object target) {…}private synchronized LinkedList findEquals(object target) {…}

}