Descrizione dei design pattern Facade, Adapter, Prototype e State.
Il facade è un design pattern strutturale.
Definisce un'interfaccia semplificata verso una libreria, un framework o qualsiasi altro sistema complesso.
Loading diagram...
Loading diagram...
public class VideoConverter {
public VideoFile convert(String inputFile, Codec codec) {
VideoFile file = new VideoFile(inputFile);
Codec ogCodec = file.getCodec();
Converter converter = new Converter(ogCodec, codec);
return converter.convert(file);
}
}
L'adapter è un design pattern strutturale.
Agevola l'interoperabilità tra interfacce diverse.
Loading diagram...
Loading diagram...
// JSList<T> è l'interfaccia target, JSListAdapter<T> è l'adapter
public class JSListAdapter<T> implements JSList<T> {
// List è l'adaptee
private List<T> list;
public JSListAdapter(List<T> list) { this.list = list; }
public int length() { return list.size(); }
public T at(int index) { return list.get(index); }
public void push(T item) { list.add(item); }
}
Nell'adapter a due vie, l'adapter, oltre l'interfaccia target, implementa anche quella dell'adaptee. Può essere utilizzato sia come adapter che come adaptee.
Nel class adapter, l'adapter estende l'adaptee.
Nell'object adapter, l'adapter contiene un'istanza dell'adaptee.
Il prototype è un design pattern creazionale.
Permette di creare nuovi oggetti clonandone uno esistente.
Loading diagram...
public class User implements Cloneable {
private String name;
private int age;
private Address address;
@Override
public User clone() {
User clone = (User) super.clone();
clone.address = this.address.clone();
return clone;
}
}
In java tutti gli oggetti possiedono un metodo clone()
.
Per poterlo utilizzare però, bisogna implementare l'interfaccia Cloneable
e cambiare la visibilità del metodo a public
.
Usando il metodo di default, la copia è shallow.
Possiamo fare un override che faccia il clone in modo ricorsivo.
Lo state è un design pattern comportamentale.
Consente di cambiare radicalmente il comportamento di un oggetto in base allo stato interno, in maniera simile ad un automa a stati finiti.
Loading diagram...
Loading diagram...
class MusicPlayer {
private PlayerState state;
public MusicPlayer() { state = new PlayerStopState(); }
public void play() { state = state.play(); }
public void stop() { state = state.stop(); }
public void sound() { state.sound(); }
}
interface PlayerState {
PlayerState play();
PlayerState stop();
void sound();
}
class PlayerPlayState implements PlayerState {
public PlayerState play() { return this; }
public PlayerState stop() { return new PlayerStopState(); }
public void sound() { System.out.println("BIP"); }
}
class PlayerStopState implements PlayerState {
public PlayerState play() { return new PlayerPlayState(); }
public PlayerState stop() { return this; }
public void sound() { }
}