Introduction To UML Class Diagrams: Pattern-Oriented Software Design
Introduction To UML Class Diagrams: Pattern-Oriented Software Design
Introduction to
UML Class Diagrams
Unifies
z
Use cases
Class diagrams
Interaction diagrams
z
z
z
z
z
z
Sequence diagrams
Collaboration diagrams
Package diagrams
State diagrams
Activity diagrams
Deployment diagrams
Three perspectives
z
Conceptual
z
z
Specification
z
z
Implementation
z
looking at classes
UML: a class
+
#
-
public
protected
private
Abstract
Concrete
data type
parameter
Example: OBSort1.cpp
Example: OBSort1.cpp
Lets think of
main() as a class
relationship
Inheritance
(knows a)
(uses a)
(has a)
(has a)
(is a)
X
z
Class template
X
(parameterized
class)
Uses a
z
z
Dependency
One object issues a function
call to a member function of
another object
Knows a
z
z
Association
One object is aware of
another; it contains a pointer
or reference to another object
Is a Has a relationship
z
Is a relationships
z
z
Inheritance
A class is derived from
another class
Has a relationships
z
z
Composition or Aggregation
A class contains other
classes as members
Aggregation Composition
X
z
z
Aggregation
z
z
Larman: use
association instead
of aggregation
Multiplicity
Relationship Examples
z
z
z
z
z
z
z
z
z
z
z
z
z
Car Engine ?
Person Cell Phone ?
Human Brain ?
Fighter Bomb ?
Fighter F16
Bomb Explosive
Bomb Nuclear Bomb
MyComplex Math ?
Tree Node Child Node ?
Tree Node Parent Node ?
Hero Life ?
Hero Score ?
Hero Map ?
Composition
Association/Composition/Dependency
Composition
Association
Inheritance
Composition/Association/Inheritance
Inheritance
Dependency
Composition
Association (if needed)
Composition/Attribute
Association/Dependency
Association/Dependency
Relationship Examples
z
z
z
z
z
z
z
z
z
z
z
z
Association/Dependency
Association
Association/Dependency
Association/Dependency
Association/Dependency
Inheritance
Composition
Composition/Attribute
Association/Dependency
Association/Dependency
Association/Dependency
Composition/Attribute
class X {
X(Y *y) : y_ptr(y) {}
void SetY(Y *y) {y_ptr = y;}
void f() {y_ptr->Foo();}
...
Y *y_ptr; // pointer
};
Y an_y();
Y an_y();
X an_x(&an_y); X an_x();
an_x.f();
an_x.SetY(&y);
an_x.f();
{
f1(Y
f2(Y
f3(Y
f4()
f5()
y) {; y.Foo();}
*y) {; y->Foo();}
&y) {; y.Foo();}
{Y y; y.Foo();}
{; Y::StaticFoo();}
Example: OBSort3.cpp
uses
getSize()
operator[]
class X {
Java?
...
Y a;
// 1; Composition
Y b[10];
// 0..10; Composition
};
class X {
X() { a = new Y[10]; }
~X(){ delete [] a; }
...
Y *a;
// 0..10; Composition
};
NOT Association
vector<Y>
Implementation detail
X
class X {
...
vector<Y> a;
};
Composition of
vector<Y>
Y
Hiding
implementation detail
NOT Composition
of Y
10
No example here
z
11
class Y {
...
};
class X : public Y {
...
};
is a relationship
Example: OOSort2.cpp
12
class X : Y
X implements Y
{
public int Foo()
{
}
}
X
Can do relationship
class Y {
...
No variables
};
Only pure virtual functions
class X : public Y {
...
};
13
...
X<Y> a;
...
14
Abstract class
15
16