06 - Simulazione
Tra quelli visti, i pattern possibili per le soluzioni sono:
- Factory Method
- Abstract Factory
- Singleton
- Adapter
- Composite
- Decorator
- Facade
- Proxy
- Strategy
- Template Method
Oracolo
Una classe Oracolo espone un metodo per restituire un numero casuale (stampaNumero).
E' richiesto di estendere il comportamento in modo da:
- stampare un messaggio di benvenuto prima di tornare il numero
- stampare un messaggio di saluto alla fine
- dare la possibilità di invertire i messaggi a runtime
Descrivere il design pattern utilizzato (nome e scopo generale) e la soluzione, includendo una breve descrizione del ragionamento e una eventuale rappresentazione del risultato finale.
Shapes
Quindi abbiamo:
- una classe astratta Shape con i metodi indicati
- due implementazioni specifiche (Triangle e Rectangle) che implementano il metodo display per stampare la forma
- una classe Circle derivante da una libreria che ha solo il metodo show per stampare la forma
Abbiamo un client che già lavora con Shape di tipo triangolo e rettangolo, ci viene chiesto di aggiungere anche la possibilità di gestire cerchi, come procedete?
class Position {
readonly x: number;
readonly y: number;
constructor(x: number, y: number) {
this.x = x;
this.y = y;
}
}
abstract class Shape {
protected position: Position = new Position(0,0);
getPosition(): Position {
return this.position
}
setPosition(position: Position) {
this.position = position;
}
abstract display();
}
class Triangle extends Shape {
display() {
// logica di stampa del triangolo
}
}
class Rectangle extends Shape {
display() {
// logica di stampa del rettangolo
}
}
class Circle {
show(x: number, y: number) {
//logica per stampa del cerchio
}
}
// logica del client
const shapes: Shape[] = [];
shapes.push(new Triangle());
shapes.push(new Rectangle());
// fare in modo di poter aggiungere anche cerchi
shapes.forEach(shape => shape.display());
Descrivere il design pattern utilizzato (nome e scopo generale) e la soluzione, includendo una breve descrizione del ragionamento e una eventuale rappresentazione del risultato finale.
Pizza
Stai sviluppando un software per il menù di una pizzeria. Ogni pizza ha un prezzo base e una serie di aggiunte disponibili che l'utente può scegliere. Ogni aggiunta ha un prezzo opzionale diverso e le scelte sono molte e potenzialmente variabili nel tempo.
Descrivi quale design pattern useresti per risolvere il problema motivando la risposta. Fornisci anche una rappresentazione in codice, pseudo-codice o diagramma delle classi della soluzione proposta.
Pesci ubriachi e affamati
Abbiamo due classi di pesci: BigFish e LittleFish, ognuna con la sua implementazione.
Entrambi i pesci si muovono in modo casuale tramite il metodo move.
BigFish si può muovere in una posizione occupata da un LittleFish (e mangiarlo).
LittleFish invece non si può muovere dove si trova un BigFish.
Descrivere:
- se e come mai è utile un design pattern per implementare le classi di questo problema
- quale struttura avranno le classi alla fine (usare pseudo-codice, non ci interessa l'implementazione esatta del movimento e dei controlli)
- il ragionamento usato per la divisione in classi
