3. Problema introduttivo (1/4)
• Bisogna sviluppare le classi Java che forniscono l’accesso ai
sensori di un’applicazione di controllo.
• Tutti i sensori eseguono una misurazione fisica e producono
un valore numerico.
• I sensori sono classificati in funzione del tipo di misurazione
che producono, ovvero un:
– valore relativo ad determinato istante di tempo
– valore relativo alle misurazioni eseguite per un determinato
intervallo di tempo
– flusso di misurazioni
Ingegneria del Software - A.A. 2003/2004
4. Problema introduttivo (2/4)
“Astrazione” dei
“Astrazione” dei
tipi di sensori
tipi di sensori
(classi di accesso)
(classi di accesso)
Gerarchia
Gerarchia
Cosa accade se ci sono più fornitori di sensori?
Cosa accade se ci sono più fornitori di sensori?
La soluzione presenta due problemi:
La soluzione presenta due problemi:
--le classi di accesso non sono riutilizzate
le classi di accesso non sono riutilizzate
--non nasconde le differenze tra iisensori di diversi produttori
non nasconde le differenze tra sensori di diversi produttori
Ingegneria del Software - A.A. 2003/2004
5. Problema introduttivo (3/4)
uses
uses
uses
La soluzione presenta un problema:
La soluzione presenta un problema:
Le classi di accesso dipendono
Le classi di accesso dipendono
dalle classi di implementazione
dalle classi di implementazione
Ingegneria del Software - A.A. 2003/2004
8. Gerarchia delle classi di accesso ai sensori indipendente
Gerarchia delle classi di accesso ai sensori indipendente
dalle classi di implementazione dei vari fornitori
dalle classi di implementazione dei vari fornitori
Gerarchia parallela di classi che implementano
Gerarchia parallela di classi che implementano
l’accesso ai sensori dei vari fornitori
l’accesso ai sensori dei vari fornitori
Gerarchia parallela di interfacce che permettono alle
Gerarchia parallela di interfacce che permettono alle
permettono alle classi di accesso di rimanere indipendenti
permettono alle classi di accesso di rimanere indipendenti
dalle classi di implementazione dei vari fornitori
dalle classi di implementazione dei vari fornitori
Ingegneria del Software - A.A. 2003/2004
12. Il pattern Bridge (1/11)
• Nome Bridge [GoF95]
• Synopsis E’ utile quando si ha una gerarchia di astrazioni e
una corrispondente gerarchia di implementazioni.
Il pattern Bridge permette di implementare le
astrazioni e le implementazioni come classi
indipendenti che possono essere combinate
dinamicamente
• Context Cfr. esempio introduttivo
Ingegneria del Software - A.A. 2003/2004
13. Il pattern Bridge (2/11)
• Force Quando si vuole:
- cambiare l’implementazione usata per un’astrazione senza dover
modificare le classi che usano l’astrazione interfacce e implementazioni
- riusare la logica comune a differenti implementazioni di
un’astrazione Es. i sensori condividano il range di valori delle misurazioni
- creare una nuova implementazione di un’astrazione senza dover
ri-implementare la logica comune delle astrazioni
Es. aggiunta nuova famiglia di sensori
- estendere la logica comune di un’astrazione scrivendo una nuova
classe anziché riscrivere una nuova classe per ogni combinazione
astrazione-implementazione
Cfr. approccio al pattern del GoF
Ingegneria del Software - A.A. 2003/2004
14. Il pattern Bridge (3/11)
Da Context a
Solution…
Mantiene il riferimento ad un
oggetto che implementa
AstractionImpl
• Solution - Gli attori del pattern Bridge:
– Abstraction - SpecializedAbstraction
– AbstractionImpl
– SpecializedAbstractionImpl
– Impl1, Impl2
– SpecializedImpl1, SpecializedImpl2
Ingegneria del Software - A.A. 2003/2004
15. Il pattern Bridge (4/11)
• Consequences
- Il pattern Bridge tiene le classi che rappresentano un’
astrazione indipendenti dalle classi che ne forniscono
un’implementazione
- Tale indipendenza può essere utile per aggiungere o
modificare le classi di una gerarchia senza dover
necessariamente riportare i cambiamenti nell’altra
- I client delle classi astrazione non hanno alcuna conoscenza
riguardo le classi di implementazione. Gli oggetti astrazione
possono quindi cambiare le implementazioni senza
ripercussioni nei confronti dei client.
Ingegneria del Software - A.A. 2003/2004
16. Il pattern Bridge (5/11)
• Implementation
- Come creare gli oggetti di implementazione per le
astrazioni?
Delegare la creazione ad un Abstract Factory preserva
l’indipendenza tra le gerarchie
- Un oggetto astrazione userà lo stesso oggetto
implementazione durante il suo ciclo di vita?
Se no, è possibile aggiungere e isolare la logica che regola il
cambiamento degli oggetti implementazione usando il
pattern Decorator
Ingegneria del Software - A.A. 2003/2004
17. Il pattern Bridge (6/11)
• Java API usage Abstract
java.awt
Component
Button … TextField
Abstract
java.awt.Toolkit
Interface
java.awt.peer
ComponentPeer
Gioca il ruolo di
Abstract Factory
per creare oggetti
specializzati per
la piattaforma in uso Interface Interface
ButtonPeer … TextFieldPeer
Ingegneria del Software - A.A. 2003/2004
18. Il pattern Bridge (7/11)
• Code example
/** Instances of this class are used to represent all kinds of sensors. Instances of subclasses *
of this class represent specialized kinds of sensors. */
public class SimpleSensor
SimpleSensor {
private SimpleSensorImpl impl;
SimpleSensor(SimpleSensorImpl impl) {
this.impl = impl; This constructor is intended to be called by aafactory
This constructor is intended to be called by factory
} method object that is in the same package as this
method object that is in the same package as this
class and the classes that implement its operations.
class and the classes that implement its operations.
protected SimpleSensorImpl getImpl() {
return impl;
}
public int getValue() throws SensorException {
return impl.getValue();
}
}
Ingegneria del Software - A.A. 2003/2004
19. Il pattern Bridge (8/11)
/**
* All objects that implement operations for SimpleSensor objects
* must implement this interface.
*/
SimpleSensorImpl
interface SimpleSensorImpl {
public int getValue() throws SensorException;
}
/**
* This class implements SimpleSensor operations for sensors made by Eagle.
*/
class EagleSimpleSensor
EagleSimpleSensor implements SimpleSensorImpl {
public int getValue() throws SensorException {
int value;
//...
return value;
}
}
Ingegneria del Software - A.A. 2003/2004
20. Il pattern Bridge (9/11)
/**
* Instances of this class are used to represent sensors that produce
* values that are the average of measurements made over a period
* of time.
*/
public class AveragingSensor extends SimpleSensor {
AveragingSensor(AveragingSensorImpl impl) {
super (impl); This constructor is intended to be called by a factory
This constructor is intended to be called by a factory
} method object that is in the same package as this
method object that is in the same package as this
class and the classes that implement its operations.
class and the classes that implement its operations.
public void startAverage() throws SensorException {
((AveragingSensorImpl) getImpl()).beginAverage();
} The impl object, an AvaragingSensorImpl object, is
The impl object, an AvaragingSensorImpl object, is
} stored as SimpleSensor by the super class constructor.
stored as SimpleSensor by the super class constructor.
Ingegneria del Software - A.A. 2003/2004
21. Il pattern Bridge (10/11)
/**
* All objects that implement operations for AveragingSensor
* objects must implement this interface.
*/
interface AveragingSensorImpl extends SimpleSensorImpl {
public void beginAverage() throws SensorException;
}
/**
* This class impelments AveragingSensor operations for sensors made by Eagle.
*/
class EagleAveragingSensor extends EagleSimpleSensor
implements AveragingSensorImpl {
public void beginAverage() throws SensorException {
//...
}
}
Ingegneria del Software - A.A. 2003/2004
22. Il pattern Bridge (11/11)
• Related Patterns
Abstract Factory/Toolkit
Il pattern Abstract Factory può essere usato dal pattern
Bridge per decidere quale famiglia di classi
implementative associare agli oggetti dell’astrazione
Ingegneria del Software - A.A. 2003/2004