Patrones de Patrones de Diseño Diseño en MDAen MDA
Patrones de DiseñoPatrones de Diseño
““descripciones de objetos que se descripciones de objetos que se comunican y clases que son comunican y clases que son personalizadas para resolver un personalizadas para resolver un problema de diseño general en problema de diseño general en un contexto particular”un contexto particular” (Gamma y (Gamma y otros, 1995) otros, 1995)
Patrones de DiseñoPatrones de Diseño
Los patrones de diseño describen Los patrones de diseño describen soluciones a problemas de diseño soluciones a problemas de diseño recurrentes.recurrentes.
Un patrón de diseño nombra, abstrae e Un patrón de diseño nombra, abstrae e identifica los aspectos claves de una identifica los aspectos claves de una estructura de diseño común que lo estructura de diseño común que lo hacen útil para crear un diseño hacen útil para crear un diseño orientado a objetos reusable.orientado a objetos reusable.
Un patrón de diseño identifica las clases Un patrón de diseño identifica las clases que participan y las instancias, sus roles que participan y las instancias, sus roles y colaboraciones, y la distribución de y colaboraciones, y la distribución de responsabilidades. responsabilidades.
Metamodelos de Patrones de Metamodelos de Patrones de DiseñoDiseño
El metamodelo de un patrón de El metamodelo de un patrón de diseño dado, describe la familia de diseño dado, describe la familia de modelos que forman el espacio de modelos que forman el espacio de soluciones de ese patrón. soluciones de ese patrón.
Metamodelos de Patrones de Metamodelos de Patrones de Diseño en MDADiseño en MDA
Metamodelos en tres niveles:Metamodelos en tres niveles:
PIM:PIM: metamodelos de patrones metamodelos de patrones definidos de manera independiente de definidos de manera independiente de cualquier plataforma o tecnología cualquier plataforma o tecnología específicas. específicas.
PSM:PSM: metamodelos de patrones metamodelos de patrones definidos teniendo en cuenta una definidos teniendo en cuenta una plataforma específica. Por ejemplo plataforma específica. Por ejemplo JAVA, EIFFEL. JAVA, EIFFEL.
ISM:ISM: metamodelos de patrones que metamodelos de patrones que corresponden a un lenguaje de corresponden a un lenguaje de programación específico. programación específico.
Metamodelos de Patrones de Metamodelos de Patrones de Diseño en MDADiseño en MDA
Los Metamodelos de Patrones a nivel Los Metamodelos de Patrones a nivel PIM son PIM son
especificados teniendo en cuenta:especificados teniendo en cuenta:
La estructuraLa estructura Los participantesLos participantes ColaboracionesColaboraciones
Metamodelos de Patrones de Metamodelos de Patrones de Diseño en MDADiseño en MDA
Metamodelos de Patrones a nivel PSM son Metamodelos de Patrones a nivel PSM son especificados teniendo en cuenta:especificados teniendo en cuenta:
El metamodelo a nivel PIM del patrónEl metamodelo a nivel PIM del patrón Las características de la plataformaLas características de la plataforma. .
Por ejemplo un metamodelo para la Por ejemplo un metamodelo para la plataforma Java restringe la herencia, plataforma Java restringe la herencia, ya que Java no permite herencia ya que Java no permite herencia múltiple, mientras que un metamodelo múltiple, mientras que un metamodelo para la plataforma EIFFEL no tendrá para la plataforma EIFFEL no tendrá esta restricción.esta restricción.
Metamodelos de Patrones de Metamodelos de Patrones de Diseño en MDADiseño en MDA
Metamodelos de Patrones a nivel ISM Metamodelos de Patrones a nivel ISM son son
especificados teniendo en cuenta:especificados teniendo en cuenta:
La gramática del lenguaje de La gramática del lenguaje de programación específicoprogramación específico
Especificación de los Especificación de los Metamodelos de Patrones de Metamodelos de Patrones de
DiseñoDiseño
La especificación del espacio de La especificación del espacio de soluciones de un patrón de diseño se soluciones de un patrón de diseño se logra a través de la especialización logra a través de la especialización del metamodelo UML y la del metamodelo UML y la especificación de un conjunto de especificación de un conjunto de restricciones escritas en OCL.restricciones escritas en OCL.
Notación de los Metamodelos Notación de los Metamodelos de Patrones de Diseñode Patrones de Diseño
Para la especificación de los metamodelos de Para la especificación de los metamodelos de los patrones se usa la notación de la los patrones se usa la notación de la especificación de UML de manera semi-formal especificación de UML de manera semi-formal usando la combinación de notación gráfica, usando la combinación de notación gráfica, lenguaje natural y lenguaje formal:lenguaje natural y lenguaje formal:
Sintaxis abstracta:Sintaxis abstracta: diagrama de clases UML diagrama de clases UML (metaclases que definen las construcciones y (metaclases que definen las construcciones y sus relaciones) junto con una descripción en sus relaciones) junto con una descripción en lenguaje natural.lenguaje natural.
Restricciones:Restricciones: son provistas usando el son provistas usando el lenguaje OCL y un lenguaje natural.lenguaje OCL y un lenguaje natural.
Semántica:Semántica: el significado de las el significado de las construcciones es definido usando lenguaje construcciones es definido usando lenguaje natural. natural.
Relaciones entre Modelos y Relaciones entre Modelos y MetamodelosMetamodelos
MMooddeell TTrraannssffoorrmmaattiioonn
IInnssttaannccee ooff
MMeettaammooddeell RReellaattiioonn
UML/OCL PIM
JAVA-CODE EIFFEL-CODE
C# -CODE
C++-CODE
PSM-J2EE PSM-EIFFEL PSM-.NET
Model
PSM
ISM
PIM
ISM
PSM
UML/OCL PSM-J2EE
UML/OCL PSM-EIFFEL
JAVA
UML/OCL PSM-.NET
EIFFEL
C++
PIM
Metamodel
UML/OCL PIM Metamodel
… … …
Ejemplo:Ejemplo:
Patrón de Diseño Patrón de Diseño ObserverObserver
Patrón de Diseño Patrón de Diseño ObserverObserver
El patrón de diseño Observer “define una dependencia uno a muchos entre objetos de manera tal que cuando un objeto cambia de estado, todos sus dependientes son notificados y actualizados automáticamente” (Gamma y otros, 1995).
Patrón Observer : Diagramas de Clases y de Patrón Observer : Diagramas de Clases y de Secuencia UMLSecuencia UML
Observer
update()
Subject
attach(Observer)detach(Observer)notify()
0..*1..*
observers
0..*1..*
ConcreteSubject
subjectState
getState()setState()
ConcreteObserver
observerState
update()
1..*
0..*subject
1..*
0..*
result= subjectState
observerState= subject->getState()
post: observers -> forAll(o:Observer | o->update())
aConcreteObserver : ConcreteObserver
aConcreteSubject : ConcreteSubject
anotherConcreteObserver : ConcreteObserver
setState( )
notify( )
update( )
update( )getState( )
getState( )
a. Class Diagram
b. Sequence Diagram
Metamodelo del Metamodelo del Patrón de Diseño Observer Patrón de Diseño Observer
a nivel PIMa nivel PIM
Patrón Observer- Metamodelo PIM : Diagrama Patrón Observer- Metamodelo PIM : Diagrama
de Clasesde Clases
Classifier
Operation
Association
Property
DirectedRelationship
Class
Association
- - - - - - - - - - - - - - - - - {redefines class}
Update
Observer
1..*
1
1..* {subsets ownedOperation}
1{redefines
class}
AssocEndObservers
0..1
1
0..1
+participant 1
RelationshipObserver
11 {redefinestarget}
SubjectObserver 1
1
1
{subsets memberEnd}
+association
1
{redefines association}
ConcreteObserver
1
1
1{subsetsownedElement}
1{redefines source}
AssocEndSubject1
1+association
1
{redefines association}1
{subsets memberEnd}
Attach Detach Notify
AssocEndConcreteObserver
1
1
1
+participant 1
Subject
0..1
1
0..1
+participant1
1..*
1
1..*
1
1..*
1
1..*
1
1..*
1
1..*
1
ObserverSubject1
1
1
{subsets memberEnd}
+association
1
{redefines association}
RelationshipSubject
11{redefines
target}
AssocEndConcreteSubject1
1 +association
1
{redefines association}1
{subsets memberEnd}
GetState
SetState
Property
ConcreteSubject
1
1
1 {subsetsownedElement}
1
{redefinessource}
1
1
1
+participant1
1..*
1
+getState
1..*
{subsets member}
1 1..*1
+setState
1..*
{subsets member}
1
1..*1
+state
1..*
{subsets member}
1
- - - - - - - - - - - - - - - - - - - - - - - - - - -{subset ownedOperation}
Patrón de Diseño ObserverPatrón de Diseño ObserverMetamodelo PIM: Restricciones Metamodelo PIM: Restricciones
Metaclase SubjectMetaclase Subject
Un sujeto, instancia de la metaclase Un sujeto, instancia de la metaclase Subject Subject puede puede
ser una clase o una interfaz. ser una clase o una interfaz.
(self.oclIsTypeOf(Class) (self.oclIsTypeOf(Class) oror self.oclIsTypeOf(Interface)self.oclIsTypeOf(Interface)
Patrón de Diseño Observer Patrón de Diseño Observer Metamodelo PIM : RestriccionesMetamodelo PIM : Restricciones
Metaclase AttachMetaclase Attach
[1] [1] Esta operación cambia el estado del sujetoEsta operación cambia el estado del sujeto..not not self.isQueryself.isQuery
[2] [2] Esta operación tiene un conjunto no vacío Esta operación tiene un conjunto no vacío de parámetros y uno de ellos debe ser de de parámetros y uno de ellos debe ser de entrada (direction= #in) y del tipo Observer.entrada (direction= #in) y del tipo Observer.
self.parameter->notEmpty( ) self.parameter->notEmpty( ) andand
self.parameter->select ( param | param.direction= self.parameter->select ( param | param.direction= #in #in andand
param.type= oclIsKindOf(Observer)) -> size( ) = 1param.type= oclIsKindOf(Observer)) -> size( ) = 1
Patrón de Diseño Observer Patrón de Diseño Observer Metamodelo PIM : RestricionesMetamodelo PIM : Restriciones
Metaclase RelationshipSubjectMetaclase RelationshipSubjectUna instancia de esta relación está restringida a ser una Una instancia de esta relación está restringida a ser una
generalización o una realización de interfaz. generalización o una realización de interfaz.
self.oclIsTypeOf( Generalization) self.oclIsTypeOf( Generalization) oror (self.oclIsTypeOf(InterfaceRealization))(self.oclIsTypeOf(InterfaceRealization))
and and
self.oclIsTypeOf(Generalization) self.oclIsTypeOf(Generalization) impliesimplies ( (self.general.oclIsKindOf(Class) self.general.oclIsKindOf(Class)
andand self.general.oclIsTypeOf(Subject) self.general.oclIsTypeOf(Subject)
andand self.specific.oclIsTypeOf(ConcreteSubject) ) self.specific.oclIsTypeOf(ConcreteSubject) )
andand
self.oclIsTypeOf(InterfaceRealization) self.oclIsTypeOf(InterfaceRealization) implies implies ( ( self.contract.oclIsKindOf(Interface) self.contract.oclIsKindOf(Interface) andand
self.contract.oclIsTypeOf(Subject) self.contract.oclIsTypeOf(Subject)
andand self.implementingClassifier.oclIsTypeOf(ConcreteSubject)) self.implementingClassifier.oclIsTypeOf(ConcreteSubject))
Metamodelo del Metamodelo del Patrón de Diseño Observer Patrón de Diseño Observer
a nivel PSM Eiffel a nivel PSM Eiffel
El Metamodelo del patrón Observer El Metamodelo del patrón Observer a nivel PSM Eiffel es una a nivel PSM Eiffel es una especialización del Metamodelo PSM especialización del Metamodelo PSM EIFFELEIFFEL
Metamodelo PSM Eiffel: Metamodelo PSM Eiffel: EiffelClassEiffelClass
Classifier (from Template)
Operation (from Kernel)
Property (from Kernel)
Class (fromKernel) *0..1
+ownedOperation
*
+class
0..1
*0..1
+ownedAttribute
*
+class
0..1
AssociationEnd
Routine
isDeferred {redefines isAbstract}isFrozen {redefines isLeaf}
Generalization (from Kernel)
Attribute
isFrozen {redefines isLeaf}
Constraint
EiffelClass
isDeferred {redefines is Abstract}isExpanded : Boolean
*
0..1
*
{subsets ownedAttribute}+class
0..1{redefines class}
*
1
+ownedRoutine *{redefines ownedOperation}
+class
1{redefines class}
*1 *
+heir
1
{redefines specific}
1+parent
1
{redefines general}
*
1
*
{subsets ownedAttribute}+class
1{redefines class}
*
+/parents
*
{redefines supperclass}
*0..1
+invariant *{redefines ownedRule}
+class
0..1
{redefines namespace}
Metamodelo PSM Eiffel: Metamodelo PSM Eiffel: RoutineRoutine
Parameter
Constraint
Type
Operation (from Kernel)
isQuery : Boolean = False
*
+redefinedOperation
*
*0..1
+ownedParameter
*
+operation
0..1
*0..1
+precondition *+preContext
0..1
*0..1
+postcondition *+postContext
0..1
0..10..1
+bodyCondition
0..1
+bodyContext
0..1
*+raisedException *
0..1+type
0..1
Procedure
isConstructor : Boolean
Type
Function
1+returnType 1 {redefines type}
Attribute
isFrozen {redefines isLeaf}
Routine
isDeferred {redefines isAbstract}isFrozen {redefines isLeaf}
Implementation
procedure : Expression
*
1
+referencedAttribute *
1
0..11
+body
0..1
+signature
1
* 1
+invokedRoutine
* 1
Patrón Observer - Metamodelo PSM-Eiffel: Patrón Observer - Metamodelo PSM-Eiffel: Diagrama de ClasesDiagrama de Clases
EiffelClass
Routine
Association
AssociationEnd
Generalization
Association
AssociationEnd
EiffelClass
- - - - - - - - - - - - - - - - - - - - - - - - {redefines class}
Update
Observer
1..*1..* {subsetsownedRoutine}
AssocEndObserver
1
1
1
+participant 1
Relationship Observer
1+parent
1{redefinesgeneral}
SubjectObserver1
1
1
{subset memberEnd}
+association
1{redefines association}
EffectiveObserver
1
1
1{subsetsgeneral ization}
+heir1
{redefinesspecific}
AssocEndSubject1
1
+association
1{redefines association}1
{subsets memberEnd}
Attach Detach Notify
AssocEndEffectiveObserver
1
1
1
+participant 1
Subject
1
1
1
+participant1
1..*1..*
1..*1..*
{subsetownedRoutine}
1..*1..*
ObserverSubject 1
1
1{subsets memberEnd}
+association
1
{redefines association}
Relationship Subject
1+parent 1{redefinesgeneral}
AssocEndEffectiveSubject
1
1+association
1
{redefines association}1
{subset memberEnd}
SetState
GetState
Attribute
EffectiveSubject
1
1
1 {subsetsgeneral ization}
+heir
1{redefinesspecific}
1
1
1
+participant1
1..*1..*{subsets member}
1..*1..*{subsets
member}1..*
1
+state1..*
{subsetsmember}
1
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {subsets ownedRoutine}
Patrón de Diseño Observer Patrón de Diseño Observer Metamodelo PSM Eiffel : Metamodelo PSM Eiffel :
RestricionesRestricionesAssocEndObserverAssocEndObserver[1]Este extremo de asociación tiene una multiplicidad [1]Este extremo de asociación tiene una multiplicidad
cuyo rango será un subconjunto (posiblemente cuyo rango será un subconjunto (posiblemente infinito) de los enteros no negativos.infinito) de los enteros no negativos.
multiplicity.lower >= 0 multiplicity.lower >= 0 andand
(self.multiplicity.upper > 0 (self.multiplicity.upper > 0 oror self.multiplicity.upper = #unlimited)self.multiplicity.upper = #unlimited)
[2]Deberá ser navegable.[2]Deberá ser navegable.
self.isNavigable( )self.isNavigable( )
Operaciones AdicionalesOperaciones Adicionales
La rutina observadora isNavigable indica si este La rutina observadora isNavigable indica si este extremo de asociación es navegable. extremo de asociación es navegable.
isNavigable = not class ->isEmpty()isNavigable = not class ->isEmpty()
Especificando Refinamientos Especificando Refinamientos en OCL:en OCL:
de PIM-UML a PSM-EIFFELde PIM-UML a PSM-EIFFEL
Reglas de Reglas de TransformaciónTransformación
La especificación de los metamodelos La especificación de los metamodelos en los tres niveles, permite construir en los tres niveles, permite construir la definición de transformación de la definición de transformación de modelo a modelo.modelo a modelo.
Las reglas de transformación que Las reglas de transformación que constituyen una definición de constituyen una definición de transformación describen como puede transformación describen como puede transformarse un modelo en un transformarse un modelo en un lenguaje origen en un modelo en un lenguaje origen en un modelo en un lenguaje destino. lenguaje destino.
Reglas de transformaciónReglas de transformaciónEn el caso del patrón de diseño observer, las reglas usan los En el caso del patrón de diseño observer, las reglas usan los metamodelos definidos en los distintos niveles para definir metamodelos definidos en los distintos niveles para definir
las las transformaciones. transformaciones. Transformación PIM-PSM:Transformación PIM-PSM:
Metamodelo Origen: “UML especializado del patrón Metamodelo Origen: “UML especializado del patrón Observer” Observer”
Metamodelo Destino: “UML especializado del patrón Metamodelo Destino: “UML especializado del patrón Observer en una plataforma específica”.Observer en una plataforma específica”.
Transformación PSM-ISM:Transformación PSM-ISM:
Metamodelo Origen: “UML especializado del patrón Metamodelo Origen: “UML especializado del patrón Observer en una plataforma específica”.Observer en una plataforma específica”.
Metamodelo Destino: “UML especializado del patrón Metamodelo Destino: “UML especializado del patrón Observer en un lenguaje de programación específico”Observer en un lenguaje de programación específico”
Transformación de PIM-UML A PSM-Transformación de PIM-UML A PSM-EIFFELEIFFEL
Transformation Transformation PIM-UML TO PSM-EIFFELPIM-UML TO PSM-EIFFEL { {parametersparameters
sourceModel: Design Pattern Metamodel :: PackagesourceModel: Design Pattern Metamodel :: PackagetargetModel: Design Pattern Metamodel-EIFFEL :: ProjecttargetModel: Design Pattern Metamodel-EIFFEL :: Project
pre:pre:-- El paquete SourceModel no importa otros paquetes.-- El paquete SourceModel no importa otros paquetes.sourceModel.importedElement sourceModel.importedElement isEmpty isEmpty
post:post:-- el número de clases del modelo target es igual al número de -- el número de clases del modelo target es igual al número de
clases más el número de interfaces del modelo source.clases más el número de interfaces del modelo source.sourceModel.ownedMembersourceModel.ownedMember select(oclIsTypeOf(Class)) select(oclIsTypeOf(Class))
size() +size() +sourceModel.ownedElementsourceModel.ownedElement select(oclIsTypeOf(Interface)) select(oclIsTypeOf(Interface))
size()=size()=targetModel.ownedElement targetModel.ownedElement
select(oclIsTypeOf(EiffelClass))select(oclIsTypeOf(EiffelClass)) size() size()
Transformación de PIM-UML A PSM-Transformación de PIM-UML A PSM-EIFFELEIFFEL
post:post:-- Para cada clase en sourceModel existe una clase Eiffel en -- Para cada clase en sourceModel existe una clase Eiffel en
targetModel tal que:targetModel tal que:sourceModel.ownedElement sourceModel.ownedElement select(oclIsTypeOf(Class)) select(oclIsTypeOf(Class)) forAll ( sourceClass | targetModel.ownedElement forAll ( sourceClass | targetModel.ownedElement select(oclIsTypeOf(EiffelClass))select(oclIsTypeOf(EiffelClass)) exists ( targetClass | exists ( targetClass |
-- sourceClass y targetClass tienen el mismo nombre y-- sourceClass y targetClass tienen el mismo nombre ysourceClass.name = targetClass.name andsourceClass.name = targetClass.name and
--- tienen el mismo conjunto de operaciones y- tienen el mismo conjunto de operaciones ysourceClass.member sourceClass.member select (oclIsTypeOf(Operation)) = select (oclIsTypeOf(Operation)) =targetClass.member targetClass.member select (oclIsKindOf(Routine)) and select (oclIsKindOf(Routine)) and
-- tienen las mismas clases padres y -- tienen las mismas clases padres y las mismas clases las mismas clases hijas,hijas,
……
Transformación de PIM-UML A PSM-Transformación de PIM-UML A PSM-EIFFELEIFFEL
post:post:-- Para cada interface en sourceModel existe una clase -- Para cada interface en sourceModel existe una clase
Eiffel en targetModel tal que:Eiffel en targetModel tal que:sourceModel.ownedElement sourceModel.ownedElement
select(oclIsTypeOf(Interface))select(oclIsTypeOf(Interface)) forAll ( sourceInterface /targetModel.ownedElement forAll ( sourceInterface /targetModel.ownedElement select(oclIsTypeOf(EiffelClass))select(oclIsTypeOf(EiffelClass)) exists ( targetClass / exists ( targetClass /
-- sourceInterface y targetClass tienen el mismo nombre y-- sourceInterface y targetClass tienen el mismo nombre ysourceInterface.name = targetClass.name andsourceInterface.name = targetClass.name and
--- tienen el mismo conjunto de operaciones y- tienen el mismo conjunto de operaciones ysourceInterface.member sourceInterface.member select (oclIsTypeOf(Operation)) select (oclIsTypeOf(Operation))
==targetClass.member targetClass.member select (oclIsKindOf(Routine)) and select (oclIsKindOf(Routine)) and
-- tienen las mismas clases padres y -- tienen las mismas clases padres y las mismas clases hijas,las mismas clases hijas,. . . . . . ) ) ) )
Metamodelo del Metamodelo del Patrón de Diseño Observer Patrón de Diseño Observer
a nivel PSM JAVA a nivel PSM JAVA
Metamodelo PSM Java: Metamodelo PSM Java: JavaClassJavaClass
Operation (from Kernel)
Class (from Kernel)
*0..1
+ownedOperation
*
+class
0..1
Type Property
(from Kernel)*
0..1
+ownedAttribute
*
+class
0..1
11
{redefines type}
AssociationEnd
Field
isFinal : Boolean {redefines isLeaf}isVolatile : Boolean
JavaOperation
JavaClass
isFinal {redefines is Leaf}1
+/superClass
1
{redefines superClass}
*
0..1
*
{subsets ownedAttribute}
+class
0..1
{redefines class}
*
0..1
+nestedClass
*
{subsets nestedClassifier}
0..1
*
0..1
*
{subsets ownedAttribute}
+class
0..1
{redefines class}
*
*
+javaExceptions
*
{redefines raisedException} *
*0..1 *
{redefines ownedOperation}+class
0..1
{redefines class}
Classifier (from Template)
Metamodelo PSM Java: Metamodelo PSM Java: JavaInterfaceJavaInterface
Method
isAbstract : BooleanisSynchronized : BooleanisFinal {redefines isLeaf}
Field
isFinal : Boolean {redefines isLeaf}isVolatile : Boolean
AssociationEndJavaInterface
*0..1 *
{redefines ownedOperation}+interface
0..1
{redefines interface}
*
0..1
*
{subsets ownedAttribute}
+interface
0..1
{redefines interface}
*
0..1
*
{subsets ownedAttribute}
+interface
0..1
{redefines interface}
1
+/superInterface
1
{redefines general}
*
0..1
+nestedInterface
*
{subsets nestedClassifier}
0..1
Operation (from Interface)
Property (from Kernel)
Interface (from Interfaces) *0..1
+ownedOperation
*
+class
0..1
*0..1
+ownedAttribute
*
+class
0..1
JavaOperation
Metamodelo PSM Java: Metamodelo PSM Java: JavaOperationJavaOperation
Constructor
Parameter
Constraint
Type
Operation (from Kernel)
isQuery : Boolean = False *0..1
+ownedParameter
*
+operation
0..1
*0..1
+postcondition
*
+postContext
0..1
0..10..1
+bodyCondition
0..1
+bodyContext
0..1
*0..1
+precondition
*
+preContext
0..1
*
+raisedException
*
0..1
+/type
0..1*
+redefinedOperation
*
JavaOperation
Field
isFinal : Boolean {redefines isLeaf}isVolatile : Boolean
Method
isAbstract : BooleanisSynchronized : BooleanisFinal {redefines isLeaf}
Implementation
procedure : Expression0..11
+body
0..1
+signature
1
*
1
+referencedField *
1
*
1
+invokedMethod*
1
Patrón Observer - Metamodelo Java: Diagrama Patrón Observer - Metamodelo Java: Diagrama de Clasesde Clases
Method
Association
AssociationEnd
DirectedRelationship
Association
AssociationEnd
Classifier
- - - - - - - - - - - - - - - - - {redefines class}
Update
Observer
1..*1..*
AssocEndObserver
1
1
1
+participant 1
Relationship Observer
11{redefinescontract}
SubjectObserver 1
1
1
{subset memberEnd}
+association
1{redefines association}
ConcreteObserver
1
1
1{subsetsinterfaceRealization}
1
{redefinesimplementing
Classifier}
AssocEndSubject1
1
+association
1{redefines association}1
{subsets memberEnd}
Attach Detach Notify
AssocEndConcreteObserver
1
1
1
+participant 1
Subject
1
1
1
+participant1
1..*1..*1..*1..*
1..*1..*
{subsetsownedOperation}
ObserverSubject 1
1
1{subsets memberEnd}
+association
1
{redefines association}
Relationship Subject
11{redefinescontract}
AssocEndConcreteSubject
1
1 +association
1
{redefines association}1
{subset memberEnd}
SetStateGetState
Field
ConcreteSubject
1
1
1{subsets
interfaceRealization}
1
{redefinesimplementing
Classifier}
1
1
1
+participant1
1..*1..*{subsets member}
1..*1..*{subsets
member}
1..*
1
+state 1..*
{subsetsmember}1
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {subsets ownedOperation}
JavaClass
Metaclase SubjectMetaclase Subject
Un sujeto, instancia de la metaclase Un sujeto, instancia de la metaclase Subject Subject puede puede
ser una clase Java o una interfaz Java. ser una clase Java o una interfaz Java.
(self.oclIsTypeOf(JavaClass) (self.oclIsTypeOf(JavaClass) oror
self.oclIsTypeOf(JavaInterface)self.oclIsTypeOf(JavaInterface)
Patrón Observer – Metamodelo PSM-Patrón Observer – Metamodelo PSM-Java: RestriccionesJava: Restricciones
Metamodelos de patrones de Metamodelos de patrones de diseño: Ventajasdiseño: Ventajas
Un metamodelo UML para un patrón de Un metamodelo UML para un patrón de diseño permite detectar la presencia de diseño permite detectar la presencia de un patrón en un modelo. un patrón en un modelo.
La especificación de los metamodelos en La especificación de los metamodelos en los tres niveles, permite construir la los tres niveles, permite construir la definición de transformaciones de modelo definición de transformaciones de modelo a modelo, logrando una generación de a modelo, logrando una generación de código más completa. código más completa.
BibliografíaBibliografía
Arnout, Karine (2004). “From Patterns to Components”. Ph. D. Arnout, Karine (2004). “From Patterns to Components”. Ph. D. Thesis, Swiss Institute of Technology (ETH Zurich) Thesis, Swiss Institute of Technology (ETH Zurich) http://se.inf.ethz.ch/people/arnout/publications/arnout_phd_thesihttp://se.inf.ethz.ch/people/arnout/publications/arnout_phd_thesis.pdfs.pdf
Gamma y Otros (1996). Gamma E., Richard H., Ralph J. y Gamma y Otros (1996). Gamma E., Richard H., Ralph J. y Vlissides J. “Design Patterns. Elements of reusable Object-Vlissides J. “Design Patterns. Elements of reusable Object-Oriented Software”. Addisson-Wesley.Oriented Software”. Addisson-Wesley.
MDA (2006). The Model Driven Architecture. MDA (2006). The Model Driven Architecture. www.omg.org/mdawww.omg.org/mda
Meyer (1997). Meyer, Bertrand. “Object-Oriented Software Meyer (1997). Meyer, Bertrand. “Object-Oriented Software Construction”. Prentice Hall PTR, 1997.Construction”. Prentice Hall PTR, 1997.
OCL (2006). Object Constraint Language. Version 2.0. OMG OCL (2006). Object Constraint Language. Version 2.0. OMG Available Specification: formal/06-05-01. Available Specification: formal/06-05-01. www.omg.orgwww.omg.org
UML (2006). Unified Modeling Language: Superstructure. UML (2006). Unified Modeling Language: Superstructure. Version 2.0. OMG Specification: formal/05-07-04 Version 2.0. OMG Specification: formal/05-07-04 www.omg.orgwww.omg.org