Top Banner
UNIT-II 1 Chapter-II A Case Study: Designing a Document Editor:
67
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 1

Chapter-IIA Case Study:

Designing a Document Editor:

Page 2: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 2

DESIGN PATTERNSB.TECH IV YR II SEMESTER(TERM 08-09) (CS05166) UNIT II PPT SLIDES

TEXT BOOKS:

1.Design Pattern by Erich Gamma, Pearson Education 2.Pattern’s in JAVA Vol-I BY Mark Grand, Wiley DreamTech3.Pattern’s in JAVA Vol-II BY Mark Grand, Wiley DreamTech4.JAVA Enterprise Design Patterns Vol-III Mark Grand, Wiley

Dream Tech5.Head First Design Patterns By Eric Freeman-Oreilly-spd..6.Design Patterns Explained By Alan Shalloway,Pearson Education

Mailing Lists

Page 3: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 3

S.NO. TOPIC PPT Slides

1 Document structure L1 4 – 13

2 20Formatting L2 14 – 20

3 Embellishment L3 21 – 25

4 Multiple look & feels L4 26 – 30

5 Multiple window systems L5 31 – 35

6 User operations L6 36 – 46

7 Spelling checking & hyphenation L7 47 – 60

8 Concluding Remarks L8 61 – 61

9 Pattern References L8 62 – 67

Page 4: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 4

Design Problems:• seven problems in Lexis's design:

Document Structure: The choice of internal representation for the document affects nearly every

aspect of Lexis's design. All editing , formatting, displaying, and textual analysis will require traversing the representation.

Formatting: How does Lexi actually arrange text and graphics into lines and columns? What objects are responsible for carrying out different formatting policies? How do these policies interact with the document’s internal representation?

Embellishing the user interface:Lexis user interface include scroll bar, borders and drop shadows that embellish

the WYSIWYG document interface. Such embellishments are likely to change as Lexis user interface evolves.

L1

Page 5: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 5

Design Problems

Supporting multiple look-and-feel standards:Lexi should adapt easily to different look-and-feel standards such as Motif and Presentation Manager (PM) without major modification.

Supporting multiple window systems:Different look-and-fell standards are usually implemented on different window system. Lexi’s design should be independent of the window system as possible.

User Operations: User control Lexi through various interfaces, including buttons and pull-down menus. The functionality beyond these interfaces is scattered throughout the objects in the application.

Spelling checking and hyphenation.: How does Lexi support analytical operations checking for misspelled words and determining hyphenation points? How can we minimize the number of classes we have to modify to add a new analytical operation?

L1

Page 6: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 6

Part II: Application: Document Editor (Lexi)

7 Design Problems

1. Document structure 2. Formatting 3. Embellishment4. Multiple look & feels5. Multiple window systems6. User operations7. Spelling checking &

hyphenation

L1

Page 7: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 7

Document Structure

Goals:– present document’s visual aspects– drawing, hit detection, alignment– support physical structure

(e.g., lines, columns)

Constraints/forces:– treat text & graphics uniformly– no distinction between one & many

L1

Page 8: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 8

Document Structure

• The internal representation for a document• The internal representation should support

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

the internal representations

L1

Page 9: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 9

Document Structure (cont.)

• Some constraints– we should treat text and graphics uniformly– our implementation shouldn’t have to distinguish

between single elements and groups of elements in the internal representation

• Recursive Composition– a common way to represent hierarchically

structured information

L1

Page 10: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 10

L1

Page 11: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 11

Document Structure (cont.)

• Glyphs– an abstract class for all objects that can

appear in a document structure– three basic responsibilities, they know

• how to draw themselves, what space they occupy, and their children and parent

• Composite Pattern– captures the essence of recursive

composition in object-oriented terms

L1

Page 12: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 12

L1

Page 13: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 13

L1

Page 14: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 14

Formatting

• A structure that corresponds to a properly formatted document

• Representation and formatting are distinct– the ability to capture the document’s physical

structure doesn’t tell us how to arrive at a particular structure

• here, we’ll restrict “formatting” to mean breaking a collection of glyphs in to lines

L2

Page 15: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 15

Formatting (cont.)

• Encapsulating the formatting algorithm– keep formatting algorithms completely

independent of the document structure– make it is easy to change the formatting

algorithm– We’ll define a separate class hierarchy for

objects that encapsulate formatting algorithms

L2

Page 16: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 16

Formatting (cont.)

• Compositor and Composition– We’ll define a Compositor class for objects that can

encapsulate a formatting algorithm– The glyphs Compositor formats are the children of a

special Glyph subclass called Composition– When the composition needs formatting, it calls its

compositor’s Compose operation– Each Compositor subclass can implement a different

line breaking algorithm

L2

Page 17: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 17

L2

Page 18: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 18

Formatting (cont.)

• Compositor and Composition (cont.)– The Compositor-Composition class split ensures a

strong separation between code that supports the document’s physical structure and the code for different formatting algorithms

• Strategy pattern– intent: encapsulating an algorithm in an object– Compositors are strategies. A composition is the

context for a compositor strategy

L2

Page 19: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 19

L2

Page 20: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 20

L2

Page 21: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 21

Embellishing the User Interface

• Considering adds a border around the text editing area and scrollbars that let the user view the different parts of the page here

• Transparent Enclosure– inheritance-based approach will result in some

problems• Composition, ScollableComposition,

BorderedScrollableComposition, …

– object composition offers a potentially more workable and flexible extension mechanism

L3

Page 22: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 22

Embellishing the User Interface (cont.)

• Transparent enclosure (cont.)– object composition (cont.)

• Border and Scroller should be a subclass of Glyph

– two notions• single-child (single-component) composition• compatible interfaces

L3

Page 23: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 23

Embellishing the User Interface (cont.)

• Monoglyph– We can apply the concept of transparent enclosure to

all glyphs that embellish other glyphs– the class, Monoglyph

• Decorator Pattern– captures class and object relationships that support embellishment by transparent enclosure

void MonoGlyph::Draw(Window* w) {_component-> Draw(w);

}void Border:: Draw(Window * w) {

MonoGlyph::Draw(w);DrawBorder(w);

}

L3

Page 24: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 24

L3

Page 25: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 25

L3

Page 26: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 26

Supporting Multiple Look-and-Feel Standards

• Design to support the look-and-feel changing at run-time

• Abstracting Object Creation– widgets– two sets of widget glyph classes for this purpose

• a set of abstract glyph subclasses for each category of widget glyph (e.g., ScrollBar)

• a set of concrete subclasses for each abstract subclass that implement different look-and-feel standards (e.g., MotifScrollBar and PMScrollBar)

L4

Page 27: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 27

Supporting Multiple Look-and-Feel Standards (cont.)

• Abstracting Object Creation (cont.)– Lexi needs a way to determine the look-

and-feel standard being targeted– We must avoid making explicit constructor

calls– We must also be able to replace an entire

widget set easily– We can achieve both by abstracting the

process of object creation

L4

Page 28: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 28

Supporting Multiple Look-and-Feel Standards (cont.)

• Factories and Product Classes– Factories create product objects– The example

• Abstract Factory Pattern– capture how to create families of related

product objects without instantiating classes directly

L4

Page 29: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 29

L4

Page 30: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 30

L4

Page 31: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 31

Supporting Multiple Window Systems

• We’d like Lexi to run on many existing window systems having different programming interfaces

• Can we use an Abstract Factory?– As the different programming interfaces on these existing

window systems, the Abstract Factory pattern doesn‘t work– We need a uniform set of windowing abstractions that lets

us take different window system impelementations and slide any one of them under a common interface

L5

Page 32: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 32

Supporting Multiple Window Systems (cont.)

• Encapsulating Implementation Dependencies– The Window class interface encapsulates the things

windows tend to do across window systems– The Window class is an abstract class– Where does the implementation live?

• Window and WindowImp• Bridge Pattern

– to allow separate class hierarchies to work together even as they evolve independently

L5

Page 33: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 33

L5

Page 34: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 34

L5

Page 35: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 35

L5

Page 36: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 36

User Operations

• Requirements– Lexi provides different user interfaces for the

operations it supported– These operations are implemented in many

different classes– Lexi supports undo and redo

• The challenge is to come up with a simple and extensible mechanism that satisfies all of these needs

L6

Page 37: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 37

User Operations (cont.)

• Encapsulating a Request– We could parameterize MenuItem with a function

to call, but that’s not a complete solution• it doesn’t address the undo/redo problem• it’s hard to associate state with a function• functions are hard to extent, and it’s hard to reuse part of

them

– We should parameterize MenuItems with an object, not a function

L6

Page 38: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 38

User Operations (cont.)

• Command Class and Subclasses– The Command abstract class consists of a

single abstract operation called “Execute”– MenuItem can store a Command object

that encapsulates a request– When a user choose a particular menu

item, the MenuItem simply calls Execute on its Command object to carry out the request

L6

Page 39: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 39

L6

Page 40: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 40

L6

Page 41: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 41

User Operations (cont.)

• Undoability– To undo and redo commands, we add an

Unexecute operation to Command’s interface– A concrete Command would store the state of

the Command for Unexecute– Reversible operation returns a Boolean value

to determine if a command is undoable

• Command History – a list of commands that have been executed

L6

Page 42: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 42

Implementing a Command History

• The command history can be seen as a list of past commands commands

• As new commands are executed they are added to the front of the history

presentpast commands

L6

Page 43: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 43

Undoing the Last Command

• To undo a command, unexecute() is called on the command on the front of the list

• The “present” position is moved past the last command

present

unexecute()

present

L6

Page 44: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 44

Undoing the Previous Command

• To undo the previous command, unexecute() is called on the next command in the history

• The present pointer is moved to point before that command

present

unexecute()

present

L6

Page 45: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 45

Redoing the Next Command

• To redo the command that was just undone, execute() is called on that command

• The present pointer is moved up past that command

present

execute()

present

L6

Page 46: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 46

The Command Pattern

• Encapsulate a request as an object

• The Command Patterns lets you– parameterize clients with different requests– queue or log requests– support undoable operations

• Also Known As: Action, Transaction

• Covered on pg. 233 in the book

L6

Page 47: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 47

Spelling Checking & Hyphenation

Goals:– analyze text for spelling errors– introduce potential hyphenation sites

Constraints/forces:– support multiple algorithms– don’t tightly couple algorithms with

document structure

L7

Page 48: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 48

Spelling Checking & Hyphenation (cont’d)

Solution: Encapsulate Traversal

Iterator– encapsulates a traversal

algorithm without exposing representation details to callers

– uses Glyph’s child enumeration operation

– This is an example of a “preorder iterator”

L7

Page 49: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 49

Spelling Checking & Hyphenation (cont’d)

TERATOR object behavioral

Intentaccess elements of a container without exposing its representation

Applicability– require multiple traversal algorithms over a container– require a uniform traversal interface over different containers– when container classes & traversal algorithm must vary

independently

Structure

L7

Page 50: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 50

Spelling Checking & Hyphenation (cont’d)

TERATOR (cont’d) object behavioral

int main (int argc, char *argv[]) { vector<string> args; for (int i = 0; i < argc; i++)

args.push_back (string (argv[i])); for (vector<string>::iterator i (args.begin ()); i != args.end (); i++) cout << *i; cout << endl; return 0;}

Iterators are used heavily in the C++ Standard Template Library (STL)

The same iterator pattern can be applied to any STL

container!for (Glyph::iterator i = glyphs.begin (); i != glyphs.end (); i++) ...

L7

Page 51: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 51

Spelling Checking & Hyphenation (cont’d)

TERATOR (cont’d) object behavioral

Consequences+ flexibility: aggregate & traversal are independent

+ multiple iterators & multiple traversal algorithms

– additional communication overhead between iterator & aggregate

Implementation– internal versus external iterators

– violating the object structure’s encapsulation

– robust iterators

– synchronization overhead in multi-threaded programs

– batching in distributed & concurrent programs

Known Uses– C++ STL iterators

– JDK Enumeration, Iterator

– Unidraw Iterator

L7

Page 52: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 52

Spelling Checking & Hyphenation (cont’d)

Visitor• defines action(s) at each step of traversal• avoids wiring action(s) into Glyphs• iterator calls glyph’s accept(Visitor) at each node• accept() calls back on visitor (a form of “static polymorphism” based

on method overloading by type)

void Character::accept (Visitor &v) { v.visit (*this); }

class Visitor {public: virtual void visit (Character &); virtual void visit (Rectangle &); virtual void visit (Row &); // etc. for all relevant Glyph subclasses};

L7

Page 53: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 53

Spelling Checking & Hyphenation (cont’d)

SpellingCheckerVisitor• gets character code from each character glyph

Can define getCharCode() operation just on Character() class

• checks words accumulated from character glyphs• combine with PreorderIterator

class SpellCheckerVisitor : public Visitor {public: virtual void visit (Character &); virtual void visit (Rectangle &); virtual void visit (Row &); // etc. for all relevant Glyph

subclassesPrivate:

std::string accumulator_;};

L7

Page 54: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 54

Spelling Checking & Hyphenation (cont’d)

Accumulating Words

Spelling check performed when a nonalphabetic character it reached

L7

Page 55: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 55

Spelling Checking & Hyphenation (cont’d)

Interaction Diagram• The iterator controls the order in which accept() is called on each

glyph in the composition• accept() then “visits” the glyph to perform the desired action• The Visitor can be sub-classed to implement various desired actions

L7

Page 56: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 56

Spelling Checking & Hyphenation (cont’d)

HyphenationVisitor

• gets character code from each character glyph

• examines words accumulated from character glyphs

• at potential hyphenation point, inserts a...

class HyphenationVisitor : public Visitor {public: void visit (Character &); void visit (Rectangle &); void visit (Row &); // etc. for all relevant Glyph

subclasses};

L7

Page 57: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 57

Spelling Checking & Hyphenation (cont’d)

Discretionary Glyph• looks like a hyphen when at end of a line• has no appearance otherwise• Compositor considers its presence when determining linebreaks

L7

Page 58: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 58

Spelling Checking & Hyphenation (cont’d)

VISITOR object behavioralIntent

centralize operations on an object structure so that they can vary independently but still behave polymorphically

Applicability– when classes define many unrelated operations– class relationships of objects in the structure rarely change, but the

operations on them change often– algorithms keep state that’s updated during traversal

Structure

L7

Page 59: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 59

Spelling Checking & Hyphenation (cont’d)

VISITOR (cont’d) object behavioral

SpellCheckerVisitor spell_check_visitor;

for (Glyph::iterator i = glyphs.begin (); i != glyphs.end (); i++) { (*i)->accept (spell_check_visitor);}

HyphenationVisitor hyphenation_visitor;

for (Glyph::iterator i = glyphs.begin (); i != glyphs.end (); i++) { (*i)->accept (hyphenation_visitor);}

L7

Page 60: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 60

Spelling Checking & Hyphenation (cont’d)

VISITOR (cont’d) object behavioral

Consequences+ flexibility: visitor & object structure are independent+ localized functionality– circular dependency between Visitor & Element interfaces– Visitor brittle to new ConcreteElement classes

Implementation– double dispatch– general interface to elements of object structure

Known Uses– ProgramNodeEnumerator in Smalltalk-80 compiler– IRIS Inventor scene rendering– TAO IDL compiler to handle different backends

L8

Page 61: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 61

Part III: Wrap-Up

Concluding Remarks

• design reuse

• uniform design vocabulary

• understanding, restructuring, & team communication

• provides the basis for automation

• a “new” way to think about design

L8

Page 62: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 62

Pattern ReferencesBooks

Timeless Way of Building, Alexander, ISBN 0-19-502402-8

A Pattern Language, Alexander, 0-19-501-919-9

Design Patterns, Gamma, et al., 0-201-63361-2 CD version 0-201-63498-8

Pattern-Oriented Software Architecture, Vol. 1, Buschmann, et al., 0-471-95869-7

Pattern-Oriented Software Architecture, Vol. 2, Schmidt, et al., 0-471-60695-2

Pattern-Oriented Software Architecture, Vol. 3, Jain & Kircher, 0-470-84525-2

Pattern-Oriented Software Architecture, Vol. 4, Buschmann, et al., 0-470-05902-8

Pattern-Oriented Software Architecture, Vol. 5, Buschmann, et al., 0-471-48648-5

L8

Page 63: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 63

Pattern References (cont’d)More Books

Analysis Patterns, Fowler; 0-201-89542-0

Concurrent Programming in Java, 2nd ed., Lea, 0-201-31009-0

Pattern Languages of Program DesignVol. 1, Coplien, et al., eds., ISBN 0-201-60734-4Vol. 2, Vlissides, et al., eds., 0-201-89527-7Vol. 3, Martin, et al., eds., 0-201-31011-2Vol. 4, Harrison, et al., eds., 0-201-43304-4

Vol. 5, Manolescu, et al., eds., 0-321-32194-4

AntiPatterns, Brown, et al., 0-471-19713-0

Applying UML & Patterns, 2nd ed., Larman, 0-13-092569-1

Pattern Hatching, Vlissides, 0-201-43293-5

The Pattern Almanac 2000, Rising, 0-201-61567-3

L8

Page 64: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 64

Pattern References (cont’d)Even More Books

Small Memory Software, Noble & Weir, 0-201-59607-5

Microsoft Visual Basic Design Patterns, Stamatakis, 1-572-31957-7

Smalltalk Best Practice Patterns, Beck; 0-13-476904-X

The Design Patterns Smalltalk Companion, Alpert, et al., 0-201-18462-1

Modern C++ Design, Alexandrescu, ISBN 0-201-70431-5

Building Parsers with Java, Metsker, 0-201-71962-2

Core J2EE Patterns, Alur, et al., 0-130-64884-1

Design Patterns Explained, Shalloway & Trott, 0-201-71594-5

The Joy of Patterns, Goldfedder, 0-201-65759-7

The Manager Pool, Olson & Stimmel, 0-201-72583-5

L8

Page 65: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 65

Pattern References (cont’d)

Early Papers“Object-Oriented Patterns,” P. Coad; Comm. of the ACM, 9/92

“Documenting Frameworks using Patterns,” R. Johnson; OOPSLA ’92

“Design Patterns: Abstraction & Reuse of Object-Oriented Design,” Gamma, Helm, Johnson, Vlissides, ECOOP ’93

ArticlesJava Report, Java Pro, JOOP, Dr. Dobb’s Journal,

Java Developers Journal, C++ Report

L8

Page 66: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 66

Pattern-Oriented Conferences

PLoP 2007: Pattern Languages of ProgramsOctober 2007, Collocated with OOPSLA

EuroPLoP 2007, July 2007, Kloster Irsee, Germany

See hillside.net/conferences/ forup-to-the-minute info.

L8

Page 67: UNIT-II1 Chapter-II A Case Study: Designing a Document Editor:

UNIT-II 67

Mailing Lists

[email protected]: present & refine patterns

[email protected]: general discussion

[email protected]: discussion on Design Patterns

[email protected]: discussion on Pattern-Oriented Software Architecture

[email protected]: discussion on user interface patterns

[email protected]: discussion on patterns for business processes

[email protected]: discussion on patterns for distributed systems

See http://hillside.net/patterns/mailing.htm for an up-to-date list.

L8