Descrizione dei design pattern Observer, Composite, Strategy e Command.
L'observer è un design pattern comportamentale.
Definisce una dipendenza di tipo uno-a-molti tra oggetti in modo che quando un oggetto cambia lo stato, tutti i suoi oggetti dipendenti vengono notificati e aggiornati automaticamente.
Loading diagram...
Loading diagram...
public abstract class Subject {
protected Set<Observer> observers;
public void attach(Observer observer) { observers.put(observer); }
public void detach(Observer observer) { observers.remove(observer); }
protected void notify(Object state) {
for (Observer observer : observers)
observer.update(this, state);
}
}
public class BookStore extends Subject {
List<Book> books;
public List<Book> getBooks() { return books; }
public void addBook(Book book) {
books.add(book);
notify(books);
}
}
public interface Observer {
public void update(Subject subject, Object state);
}
public class Reader implements Observer {
List<String> bookWishlist;
@Override
public void update(Subject subject, Object state){
if (state instanceof List<Book> books){
for (Book book : books) {
if (wishlist.contains(book))
book.buy();
}
}
}
}
Data l'importanza del pattern, Java ne fornisce una implementazione nativa, con le interfacce Observer
e Observable
.
Tuttavia il loro utilizzo è stato deprecato a partire dalla versione 9.
L'alternativa nativa è rappresentata da java.util.concurrent.Flow
, che fornisce un'interfaccia per la pubblicazione e sottoscrizione di eventi in maniera asincrona.
Il composite è un design pattern strutturale.
Consente di rappresentare oggetti composti da altri oggetti in modo da trattarli come se fossero oggetti semplici.
Loading diagram...
public interface Item {
public float getCost();
}
public class Book implements Item {
private float price;
public float getCost() { return price; }
}
public class Box implements Item {
private List<Item> items;
public void add(Item item) { items.add(item); }
public void remove(Item item) { items.remove(item); }
public float getCost() {
float cost = 0;
for (Item item : items)
cost += item.getCost();
return cost;
}
}
Il strategy è un design pattern comportamentale.
Consente di definire una famiglia di algoritmi, rendendoli intercambiabili e indipendenti dagli altri.
Loading diagram...
Loading diagram...
public class Graph {
// ...
SPAlgorithm algorithm;
public void setShortestPathAlgorithm(SPAlgorithm algorithm) {
this.algorithm = algorithm;
}
public List<Node> shortestPath(Node source, Node destination) {
return algorithm.shortestPath(source, destination);
}
}
public class Dijkstra implements SPAlgorithm {
public List<Node> shortestPath(Node source, Node destination) {
// ...
}
}
public class BellmanFord implements SPAlgorithm {
public List<Node> shortestPath(Node source, Node destination) {
// ...
}
}
Il command è un design pattern comportamentale.
Prevede di incapsulare una richiesta in un oggetto, permettendo di parametrizzare uno stesso invoker con richieste diverse, impostando arbitrariamente il receiver della determinata richiesta.
Loading diagram...
Loading diagram...
// Invoker
public class Button {
Command command;
public void setCommand(Command command) {
this.command = command;
}
public void click() {
command.execute();
}
}
// Receiver
public class DeathStar {
private int x, y;
public void selfDestroy() {
System.out.println("La Death Star si è autodistrutta. But why?");
}
public void fireLaser() {
System.out.println("Si spara il laser nel punto (" + x + ", " + y + ")");
}
public void aim(int x, int y) {
this.x = x; this.y = y;
}
}
public interface Command {
void execute();
}
public class SelfDestructCommand implements Command {
private DeathStar deathStar;
public SelfDestructCommand(DeathStar deathStar) {
this.deathStar = deathStar;
}
public void execute() { deathStar.selfDestroy(); }
}
public class ShootCommand implements Command {
private DeathStar deathStar;
private int x, y;
public ShootCommand(DeathStar deathStar, int x, int y) {
this.deathStar = deathStar;
this.x = x;
this.y = y;
}
public void execute() { deathStar.aim(x, y); deathStar.fireLaser(); }
}