Descrizione dei design pattern Mediator, Decorator, Bridge e Chain of Responsibility.
Il Mediator è un design pattern comportamentale.
Definisce un oggetto che incapsula come un insieme di oggetti interagisce. Invece di rendere strettamente interconnessi tutti gli oggetti del gruppo, si può optare per eleggere un mediatore che si occupi di gestire le interazioni.
Loading diagram...
public class Grid {
private List<Appliance> appliances = new ArrayList<Appliance>();
private Meter meter;
public void setMeter(Meter meter) { this.meter = meter; }
public void addAppliance(Appliance appliance) { appliances.add(appliance); }
public void turnOnAll() { appliances.forEach(a -> a.turnOn()); }
public void turnOffAll() { appliances.forEach(a -> a.turnOff()); }
public void updateAll() {
for(Appliance a : appliances) {
int reading = a.update();
meter.updateMeter(reading);
}
}
public void turnOn(String appliance) {
appliances.stream()
.filter(a -> a.getName().equals(appliance))
.forEach(a -> a.turnOn());
}
public void turnOff(String appliance) {
appliances.stream()
.filter(a -> a.getName().equals(appliance))
.forEach(a -> a.turnOff());
}
}
public class Meter {
private Grid grid;
private int reading = 0;
Meter(Grid grid) { this.grid = grid; }
public void turnOn() { grid.turnOnAll(); }
public void turnOff() { grid.turnOffAll(); }
public void updateMeter(int reading) {
this.reading += reading;
}
}
public class Switch {
private Grid grid;
Switch(Grid grid) { this.grid = grid; }
public void turnOn() { grid.turnOn("Light"); }
public void turnOff() { grid.turnOff("Light"); }
}
public class Button {
private Grid grid;
Button(Grid grid) { this.grid = grid; }
public void turnOn() { grid.turnOn("Fan"); }
public void turnOff() { grid.turnOff("Fan"); }
}
public abstract class Appliance {
protected int consumption;
protected boolean isOn = false;
protected Meter meter;
public void turnOn() { isOn = true; }
public void turnOff() { isOn = false; }
public int readConsumption() { return isOn ? consumption : 0; }
}
public class Light extends Appliance {
Light() { this.consumption = 100; }
public void makeLight() { /* ... */ }
}
public class Fridge extends Appliance {
Fridge() { this.consumption = 200; }
public void makeCold() { /* ... */ }
}
public class Fan extends Appliance {
Fan() { this.consumption = 50; }
public void makeAir() { /* ... */ }
}
Il Decorator è un design pattern strutturale.
Permette di aggiungere funzionalità ad un oggetto dinamicamente, senza dover creare una sottoclasse.
Loading diagram...
public interface IPizza {
public void eat();
}
public class Pizza implements IPizza {
@Override
public void eat() { System.out.println("Una bella pizza"); }
}
public abstract class PizzaDecorator extends Pizza {
protected IPizza pizza;
public PizzaDecorator(IPizza pizza) { this.pizza = pizza; }
@Override
public void eat() { pizza.eat(); }
}
public class PizzaWithMozzarella extends PizzaDecorator {
public PizzaWithMozzarella(IPizza pizza) { super(pizza); }
@Override
public void eat() {
super.eat();
System.out.println("con mozzarella");
}
}
public class PizzaWithTomato extends PizzaDecorator {
public PizzaWithTomato(IPizza pizza) { super(pizza); }
@Override
public void eat() {
super.eat();
System.out.println("con pomodoro");
}
}
Il Bridge è un design pattern strutturale.
Permette di separare l'astrazione dall'implementazione, in modo che entrambe possano variare indipendentemente.
Loading diagram...
public abstract class Shape {
protected Drawing impl;
public void setImplementor(Drawing imp) { this.impl = imp; }
public void drawLine(int x, int y, int z, int t){ impl.drawLine(x, y, z, t);}
public abstract void draw();
}
public class Rectangle extends Shape {
int x1, y1, x2, y2;
public Rectangle(int x1, int y1, int x2, int y2) {
this.x1 = x1;
this.y1 = y1;
this.x2 = x2;
this.y2 = y2;
}
@Override
public void draw() {
drawLine(x1, y1, x1, y2); drawLine(x1, y1, x2, y1);
drawLine(x1, y2, x2, y2); drawLine(x2, y1, x2, y2);
}
}
public interface Drawing {
public void drawLine(int x1, int y1, int x2, int y2);
}
public class RedDrawing implements Drawing {
@Override
public void drawLine(int x1, int y1, int x2, int y2) {
System.out.println("Disegno una linea rossa da (x1, y1) a (x2, y2)");
}
}
public class BlueDrawing implements Drawing {
@Override
public void drawLine(int x1, int y1, int x2, int y2) {
System.out.println("Disegno una linea blu da (x1, y1) a (x2, y2)");
}
}
La Chain of Responsibility è un design pattern comportamentale.
Permette di creare una catena di oggetti che si occupano di gestire una richiesta, passandola in avanti se non sono in grado di gestirla.
Loading diagram...
public Interface Validation {
public void handleRequest(Request request);
}
public abstract class EmailValidation implements Validation {
private EmailValidation successor;
public void setSuccessor(EmailValidation successor) {
this.successor = successor;
}
public void handleRequest(Request request) {
if (successor)
successor.handleRequest(request);
else
System.out.println("Email validata!");
}
}
public class EmailValidationAt extends EmailValidation {
public void handleRequest(Request request) {
if(request.getData().contains("@")) {
super.handleRequest(request);
} else {
System.out.println("Email non valida");
}
}
}
public class EmailValidationDomain extends EmailValidation {
public void handleRequest(Request request) {
if(request.getData().contains(".")) {
super.handleRequest(request);
} else {
System.out.println("Email non valida");
}
}
}