<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Design pattern - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Impara a programmare gratuitamente! Tutorial di programmazione su Python, JavaScript, Linux e molto altro. ]]>
        </description>
        <link>https://www.freecodecamp.org/italian/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Design pattern - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/italian/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sat, 09 May 2026 13:41:49 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/italian/news/tag/design-pattern/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ I 3 Tipi di Design Pattern che Tutti gli Sviluppatori Dovrebbero Conoscere (con esempi di codice per ciascuno) ]]>
                </title>
                <description>
                    <![CDATA[ Cos'è un Design Pattern? I design pattern [https://it.wikipedia.org/wiki/Design_pattern] (schemi progettuali) sono soluzioni a livello di progettazione per problemi ricorrenti con i quali gli ingegneri informatici hanno spesso a che fare. Non è codice. Lo ripeto, ❌ CODICE. È come una descrizione di come affrontare questi problemi e progettare una soluzione. ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/i-3-tipi-di-design-pattern-che-tutti-gli-sviluppatori-dovrebbero-conoscere/</link>
                <guid isPermaLink="false">63ef5a7687f2e0059ba2e132</guid>
                
                    <category>
                        <![CDATA[ Design pattern ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Roberto Pauletto ]]>
                </dc:creator>
                <pubDate>Mon, 27 Feb 2023 05:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2023/02/design-patterns-everywhere.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/the-basic-design-patterns-all-developers-need-to-know/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">The 3 Types of Design Patterns All Developers Should Know (with code examples of each)</a>
      </p><h1 id="cos-un-design-pattern"><strong>Cos'è<strong> </strong>un <strong>Design Pattern?</strong></strong></h1><p>I <a href="https://it.wikipedia.org/wiki/Design_pattern">design pattern</a> (schemi progettuali) sono soluzioni a livello di progettazione per problemi ricorrenti con i quali gli ingegneri informatici hanno spesso a che fare. Non è codice. Lo ripeto, ❌<strong> CODICE</strong>. È come una descrizione di come affrontare questi problemi e progettare una soluzione.</p><p>L'uso di questi pattern è considerato una buona pratica, visto che la progettazione della soluzione è stata abbondantemente provata e testata, risultando in una maggiore leggibilità del codice finale. I design pattern sono creati piuttosto spesso per e usati da linguaggi di programmazione orientati agli oggetti (OOP), come Java, linguaggio nel quale sarà scritta la maggior parte degli esempi da qui in avanti.</p><h2 id="tipi-di-design-pattern"><strong><strong>T</strong>ipi di<strong> design pattern</strong></strong></h2><p>Ci sono circa 26 design pattern attualmente noti (dubito fortemente che li esaminerò tutti...).</p><p>Questi 26 possono essere classificati in 3 tipi:</p><p>1. Creazionali: progettati per creare un'istanza di una classe. Possono essere sia pattern di creazione di classi che di creazione di oggetti.</p><p>2. Strutturali: progettati in relazione alla struttura e la composizione di una classe. L'obiettivo principale della maggior parte di questi schemi è aumentare la funzionalità della classe (o classi) coinvolta, senza cambiare più di tanto la sua composizione.</p><p>3. Comportamentali: progettati a seconda di come una classe comunica con le altre.</p><p>In questo post, esamineremo un design pattern di base per ciascun tipo di classificazione.</p><h2 id="tipo-1-creazionali-il-design-pattern-singleton"><strong><strong>T</strong>ipo<strong> 1: </strong>Creazionali<strong> - </strong>Il<strong> Design Pattern</strong> Singleton</strong></h2><p>Il &nbsp;<a href="https://it.wikipedia.org/wiki/Singleton_(informatica)">design pattern Singleton</a> ha l'obiettivo di creare una sola istanza di una classe e di fornire un solo punto di accesso globale a quell'oggetto. Un esempio comunemente citato di tale classe in Java è Calendar, dove non puoi creare un'istanza di quella classe. Utilizza anche il suo metodo <code>getInstance()</code> per ottenere l'oggetto da usare.</p><p>Una classe che usa il design pattern Singleton includerà:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2019/07/singleton-class-diagram.png" class="kg-image" alt="singleton-class-diagram" width="600" height="400" loading="lazy"><figcaption>Diagramma della classe Singleton</figcaption></figure><ol><li>Una variabile privata statica, associata all'istanza della classe.</li><li>Un costruttore privato, in modo che non possa essere istanziato da nessun'altra parte.</li><li>Un metodo statico pubblico, per ritornare la singola istanza della classe.</li></ol><p>Ci sono molte diverse implementazioni di questo pattern. Oggi esamineremo le seguenti:</p><p>1. Creazione immediata (Eager)</p><p>2. Creazione differita (Lazy) </p><p>3. Creazione <a href="https://it.wikipedia.org/wiki/Thread_safety">Thread-safe</a></p><h3 id="creazione-immediata-eager-"><strong>Creazione Immediata (<strong>Eager</strong>)</strong></h3><pre><code class="language-java">public class EagerSingleton {
	// crea un'istanza della classe.
	private static EagerSingleton instance = new EagerSingleton();

	// costruttore privato, in modo che non possa essere istanziato al di fuori di questa classe.
	private EagerSingleton() {  }

	// ottiene l'unica istanza dell'oggetto creato.
	public static EagerSingleton getInstance() {
		return instance;
	}
}</code></pre><p>La creazione dell'istanza avviene durante il caricamento della classe, visto che l'istanza della classe viene associata alla variabile al di fuori di qualsiasi metodo. Questo comporta un pesante svantaggio se questa classe non viene mai usata dall'applicazione client. Il piano di emergenza, se questa classe non viene usata, è usare il metodo di creazione differita (Lazy).</p><h3 id="creazione-differita-lazy-"><strong>Creazione Differita (<strong>Lazy</strong>)</strong></h3><p>Non c'è molta differenza rispetto all'implementazione qui sopra. Le differenze principali sono che la variabile statica viene dichiarata inizialmente <code>null</code> e viene istanziata solo all'interno del metodo <code>getInstance()</code> se, e solo se, la variabile di istanza risulta <code>null</code> al tempo della verifica.</p><pre><code class="language-java">public class LazySingleton {
	// inizializza l'istanza come  null.
	private static LazySingleton instance = null;

	// costruttore privato, in modo che non possa essere istanziato al di fuori di questa classe.
	private LazySingleton() {  }

	// verifica se l'istanza è null, e in questo caso, crea l'oggetto.
	public static LazySingleton getInstance() {
		if (instance == null) {
			instance = new LazySingleton();
		}
		return instance;
	}
}</code></pre><p>Questo risolve un problema, ma ne esiste ancora un altro. Cosa succede se due client diversi accedono alla classe Singleton allo stesso tempo, al millisecondo?. Entrambi verificheranno se l'istanza è <code>null</code> allo stesso tempo e ciò sarà vero, pertanto verranno create due istanze della classe, una per richiesta fatta da ciascun client. Per risolvere questo problema si deve implementare un modo di istanziare di tipo <a href="https://it.wikipedia.org/wiki/Thread_safety">Thread Safe</a>.</p><h3 id="creazione-thread-safe-la-sicurezza-la-chiave"><strong>Creazione Thread-safe - La sicurezza è la Chiave</strong></h3><p>In Java, la parola chiave <code>synchronized</code> viene usata su metodi o oggetti per implementare la <a href="https://it.wikipedia.org/wiki/Thread_safety">thread-safety</a>, in modo che solo un thread abbia accesso a una particolare risorsa a un dato momento. La creazione dell'istanza della classe viene posta all'interno di un blocco <code>synchronized</code> in modo che un solo client alla volta possa accedere a quel metodo in un dato momento.</p><pre><code class="language-java">public class ThreadSafeSingleton {
	// inizializza l'istanza come null.
	private static ThreadSafeSingleton instance = null;

	// costruttore privato, in modo che non possa essere istanziato al di fuori di questa classe.
	private ThreadSafeSingleton() {  }

	// verifica se l'istanza è null, all'interno di un blocco synchronized block. Se vero, crea l'oggetto
	public static ThreadSafeSingleton getInstance() {
		synchronized (ThreadSafeSingleton.class) {
			if (instance == null) {
				instance = new ThreadSafeSingleton();
			}
		}
		return instance;
	}
}</code></pre><p>Il sovraccarico per il metodo <code>synchronized</code> è elevato e riduce le prestazioni dell'intera operazione.</p><p>Per esempio, se la variabile di istanza è già stata istanziata, ogni volta che un qualunque client accede al metodo <code>getInstance()</code>, viene eseguito il metodo <code>synchronized</code> e le prestazioni calano. Questo succede in quanto si deve verificare se il valore della variabile &nbsp;<code>instance</code> è <code>null</code>. Se la verifica è vera, si esce dal metodo.</p><p>Per ridurre questo sovraccarico, viene usato un sistema chiamato double locking (doppio blocco). La verifica viene effettuata anche prima della chiamata del metodo &nbsp;<code>synchronized</code>, e solo se il valore è <code>null</code> il metodo <code>synchronized</code> viene eseguito.</p><pre><code class="language-java">// Il doppio blocco viene utilizzato per ridurre il sovraccarico del metodo sincronizzato
public static ThreadSafeSingleton getInstanceDoubleLocking() {
	if (instance == null) {
		synchronized (ThreadSafeSingleton.class) {
			if (instance == null) {
				instance = new ThreadSafeSingleton();
			}
		}
	}
	return instance;
}</code></pre><p>Passiamo alla prossima classificazione.</p><h2 id="tipo-2-strutturale-il-design-pattern-decorator"><strong><strong>T</strong>ipo<strong> 2: Stru</strong>t<strong>tural</strong>e<strong> - </strong>Il<strong> Design Pattern</strong> Decorator</strong></h2><p>Ti prospetterò un piccolo scenario per offrirti un miglior contesto per capire perché e dove dovresti usare il <a href="https://it.wikipedia.org/wiki/Decorator">pattern Decorator</a>.</p><p>Diciamo che possiedi un coffee shop, e come qualunque altro che parta con un'attività, inizi con solo due tipi di semplice caffè: la miscela della casa e il tostato scuro. Nel software che gestisce il tuo listino prezzi, c'è solo una classe per diverse miscele di caffè, che eredita dalla classe astratta <code>Beverage</code> (bevanda). I clienti iniziano ad affluire e consumano il tuo meraviglioso (anche se un po' amaro?) caffè. Poi c'è chi ha appena iniziato a bere caffè che vorrebbe aggiungere, Dio ce ne scampi, zucchero o latte. Che obbrobrio!!</p><p>Ora devi creare anche queste due aggiunte, inserendole sfortunatamente sia nel menù che nel listino prezzi. All'inizio il tuo tecnico informatico ha creato una sottoclasse per entrambi i tipi di caffè, una che include lo zucchero, e un'altra che include il latte. Poi visto che il cliente ha sempre ragione, uno pronuncia questa temuta frase:</p><p><em><em><em><em><em><em>“</em></em></em></em></em>Posso avere un caffè con latte, e zucchero per favore<em><em><em><em><em>?”</em></em></em></em></em></em></p><h3 id=""><strong><strong>???</strong></strong></h3><p>Ecco il tuo listino prezzi che ti ride in faccia nuovamente. Va bene, torniamo alla lavagna….</p><p>Il tuo programmatore aggiunge caffè con latte e zucchero come sottoclasse di ciascuna classe genitore che rappresenta un tipo di caffè. Il resto del mese va via che è un piacere, con i clienti in coda per consumare il tuo caffè, stai addirittura facendo soldi. ??</p><p>Un momento, c'è dell'altro!</p><p>Ancora una volta il mondo cospira ai tuoi danni. Un concorrente apre dall'altra parte della strada, non solo con 4 tipi di caffè, ma anche con più di 10 aggiunte!</p><p>Adotti anche tu queste aggiunte, per vendere un caffè migliore, e ti sei appena ricordato che hai dimenticato di aggiornare il tuo maledetto listino prezzi. Non è certamente possibile creare un numero infinito di sottoclassi per qualunque combinazione di tutte le integrazioni, includendo anche le nuove miscele di caffè. Senza contare la dimensione finale del sistema.</p><p>È ora di investire in un sistema di listino prezzi appropriato. Trovi dei nuovi programmatori, che in effetti sanno cosa stanno facendo e ti dicono:</p><p><em><em><em><em><em><em>“</em></em></em></em></em>Sarebbe stato molto più facile e ridotto se si fosse usato il pattern decorator<em><em><em><em><em>.”</em></em></em></em></em></em></p><h3 id="cosa-diamine-"><strong>Cosa diamine è<strong>?</strong></strong></h3><p>Il <a href="https://it.wikipedia.org/wiki/Decorator">design pattern decorator</a> rientra nella categoria strutturale, che ha a che fare con l'effettiva struttura di una classe, sia per ereditarietà che per composizione o entrambe. Lo scopo è di modificare la funzionalità di un oggetto in fase di esecuzione. Questo è uno di molti altri design pattern che utilizzano classi astratte e interfacce con la composizione per ottenere il risultato desiderato.</p><p>Diamo una possibilità alla matematica (hai i brividi?) per portare tutto questo in prospettiva.</p><p>Ipotizziamo 4 miscele di caffè e 1o aggiunte. Se continuiamo con la tattica della generazione di sottoclassi per ciascuna diversa combinazione di tutte le aggiunte per ciascun tipo di miscela avremo:</p><p>(10–1)² = 9² = 81 sottoclassi</p><p>Ne togliamo una dalle 1o in quanto non puoi combinare un'aggiunta con un'altra dello stesso tipo, zucchero con zucchero sembra stupido. E questo è per solo una miscela. Moltiplica &nbsp;<strong><strong><strong><strong>81 </strong></strong></strong>per<strong><strong><strong> 4</strong></strong></strong></strong> e ottieni un mostruoso totale di <strong><strong><strong><strong>324</strong></strong></strong></strong> sottoclassi diverse! Pensa a tutto il codice che si dovrebbe scrivere…</p><p>Tuttavia con il pattern decorator ti serviranno solo 16 classi in questo scenario. Scommettiamo?</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2019/07/decorator-class-diagram.png" class="kg-image" alt="decorator-class-diagram" width="600" height="400" loading="lazy"><figcaption>Diagramma delle classi per il pattern decorator</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2019/07/decorator-coffee-class-diagram.png" class="kg-image" alt="decorator-coffee-class-diagram" width="600" height="400" loading="lazy"><figcaption>Diagramma delle classi in base allo scenario coffee shop</figcaption></figure><p>Se mappiamo il nostro scenario in base all'ipotesi sopra citata, abbiamo 4 classi per le quattro miscele di caffè, 10 per ciascuna aggiunta (<code>AddOn</code>), 1 per il componente astratto e una ulteriore per il decorator astratto. Vedi! 16! Ora dammi $100 (sto scherzando, ma se me li dai non li rifiuto... giusto per dire).</p><p>Come puoi vedere qui sopra, così come le classi concrete che rappresentano le miscele di caffè &nbsp;(<code>HouseBlend</code> e <code>DarkRoast</code> ad esempio) sono sottoclassi della classe astratta <code>Beverage</code>, anche la classe astratta <code>AddOn</code> (aggiunta) eredita da essa i suoi metodi. Le aggiunte (le classi <code>Milk</code> e <code>Sugar</code> nel diagramma), che sono sottoclassi di <code>AddOn</code>, a loro volta erediteranno qualsiasi nuovo metodo creato per aggiungere funzionalità all'oggetto base quando necessario.</p><p>Scriviamo un po' di codice per vedere il pattern in azione.</p><p>Per prima cosa creiamo la classe astratta <code>Beverage</code>, dalla quale erediteranno tutte le classi che rappresentano le diverse miscele di caffè:</p><pre><code class="language-java">public abstract class Beverage {
	private String description;
    
	public Beverage(String description) {
		super();
		this.description = description;
	}
    
	public String getDescription() {
		return description;
	}
    
	public abstract double cost();
}</code></pre><p>Poi aggiungiamo le due classi concrete per le miscele di caffè.</p><pre><code class="language-java">public class HouseBlend extends Beverage {
	public HouseBlend() {
		super(“House blend”);
	}

	@Override
	public double cost() {
		return 250;
	}
}

public class DarkRoast extends Beverage {
	public DarkRoast() {
		super(“Dark roast”);
	}

	@Override
	public double cost() {
		return 300;
	}
}</code></pre><p>Anche la classe astratta <code>AddOn</code> eredita da <code>Beverage</code> (maggiori dettagli qui sotto).</p><pre><code class="language-java">public abstract class AddOn extends Beverage {
	protected Beverage beverage;

	public AddOn(String description, Beverage bev) {
		super(description);
		this.beverage = bev;
	}

	public abstract String getDescription();
}</code></pre><p>Ora le implementazioni concrete di questa classe astratta:</p><pre><code class="language-java">public class Sugar extends AddOn {
	public Sugar(Beverage bev) {
		super(“Sugar”, bev);
	}

	@Override
	public String getDescription() {
		return beverage.getDescription() + “ with Mocha”;
	}

	@Override
	public double cost() {
		return beverage.cost() + 50;
	}
}

public class Milk extends AddOn {
	public Milk(Beverage bev) {
		super(“Milk”, bev);
	}

	@Override
	public String getDescription() {
		return beverage.getDescription() + “ with Milk”;
	}

	@Override  public double cost() {
		return beverage.cost() + 100;
	}
}</code></pre><p>Come puoi vedere qui sopra, possiamo passare qualsiasi sottoclasse di <code>Beverage</code> a qualsiasi sottoclasse di <code>AddOn</code> e ottenere il costo aggiuntivo assieme alla descrizione aggiornata. Poi, visto che la classe <code>AddOn</code> è essenzialmente di tipo <code>Beverage</code>, possiamo passare un <code>AddOn</code> in un altro <code>AddOn</code>. In questo modo possiamo usare un qualsiasi numero di aggiunte (<code>AddOn</code>) per una specifica miscela di caffè.</p><p>Ora scriviamo del codice per testare tutto quanto.</p><pre><code class="language-java">public class CoffeeShop {
	public static void main(String[] args) {
		HouseBlend houseblend = new HouseBlend();
		System.out.println(houseblend.getDescription() + “: “ + houseblend.cost());

		Milk milkAddOn = new Milk(houseblend);
		System.out.println(milkAddOn.getDescription() + “: “ + milkAddOn.cost());

		Sugar sugarAddOn = new Sugar(milkAddOn);
		System.out.println(sugarAddOn.getDescription() + “: “ + sugarAddOn.cost());
	}
}</code></pre><p>Il risultato finale è:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2019/07/decorator-final.PNG" class="kg-image" alt="decorator-final" width="600" height="400" loading="lazy"><figcaption>P.S. prezzi in Rupie dello SriLanka</figcaption></figure><p>Funziona! Siamo stati in grado di aggiungere più di una aggiunta a una miscela di caffè e aggiornare con successo il suo costo e descrizione finale, senza dove creare un numero infinito di sottoclassi per ciascuna combinazione di aggiunte per tutte le miscele di caffè.</p><p>Infine, passiamo all'ultima categoria.</p><h2 id="tipo-3-comportamentale-il-design-pattern-command"><strong><strong>T</strong>i<strong>p</strong>o<strong> 3: </strong>Comportamentale<strong> - </strong>Il <strong>Design Pattern</strong> Command</strong></h2><p>Un design pattern di tipo comportamentale si focalizza su come le classi e gli oggetti comunicano tra loro. Lo scopo principale del <a href="https://it.wikipedia.org/wiki/Command_pattern">pattern command</a> è di inculcare un alto grado di loose coupling tra le parti coinvolte (leggi: classi).</p><p><em><em><em><em><em><em>Uhhhh… </em></em></em></em></em>Cos'è<em><em><em><em><em>?</em></em></em></em></em></em></p><p>L'accoppiamento (coupling) è il modo nel quale due (o più) classi interagiscono tra loro. Lo scenario ideale sarebbe quello nel quale le classi che interagiscono non debbano dipendere molto strettamente le une dalle altre. Questo è il loose coupling. Quindi una definizione migliore di loose coupling sarebbe, classi che sono interconnesse, facendo il minor uso possibile le une delle altre.</p><p>La necessità di questo pattern nacque quando occorreva inviare delle richieste senza conoscere esplicitamente cosa stavi chiedendo e chi fosse il destinatario.</p><p>In questo modello, la classe chiamante è disaccoppiata dalla classe che esegue realmente un'azione. La classe chiamata deve avere solo un metodo (in genere chiamato <code>execute()</code>) che esegua i comandi necessari, quando il client lo richiede.</p><p>Facciamo un semplice esempio reale, ordinare un pasto in un bel ristorante. Seguendo il flusso delle azioni, tu ordini un piatto (dai un comando) al cameriere (il chiamante), il quale a sua volta lo passa allo chef (il destinatario), in modo che tu possa avere quanto ordinato. Potrebbe sembrare semplice... ma così così da programmare.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2019/07/chain-of-command-be-like-pop-snoke-im-going-to-27790631.png" class="kg-image" alt="chain-of-command-be-like-pop-snoke-im-going-to-27790631" width="600" height="400" loading="lazy"></figure><p>L'idea è piuttosto semplice, ma il codice non tanto.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/news/content/images/2019/07/command-class-diagram.PNG" class="kg-image" alt="command-class-diagram" width="600" height="400" loading="lazy"><figcaption>Diagramma di classi del Design Pattern Command</figcaption></figure><p>Dal punto di vista tecnico, il flusso delle operazioni è: tu, il cliente, crei un comando concreto, che implementa l'interfaccia <code>Command</code>, chiedendo al destinatario (lo chef) di completare un'azione, e invii il comando al chiamante (il cameriere). Il chiamante è la persona che sa quando impartire questo comando. Lo chef &nbsp;è l'unico che sa cosa fare quando riceve uno specifico comando/ordine. Quindi quando il metodo <code>execute</code> del chiamante viene eseguito, a sua volta fa si che il metodo <code>execute</code> degli oggetti derivati dalla classe <code>Command</code> venga eseguito sul destinatario, pertanto completando le azioni necessarie.</p><h3 id="quello-che-serve-implementare-"><strong>Quello che serve implementare è<strong>;</strong></strong></h3><ol><li>Una interfaccia <code>Command</code></li><li>Una classe &nbsp;<code>Order</code> - ordine - che implementi l'interfaccia <code>Command</code></li><li>Una classe &nbsp;<code>Waiter</code> - cameriere - (chiamante)</li><li>Una classe <code>Chef</code> (destinatario)</li></ol><p>Quindi il codice è il seguente:</p><h3 id="chef-il-destinatario"><strong><strong>Chef, </strong>il destinatario</strong></h3><pre><code class="language-java">public class Chef {
	public void cookPasta() {
		System.out.println(“Chef is cooking Chicken Alfredo…”);
	}

	public void bakeCake() {
		System.out.println(“Chef is baking Chocolate Fudge Cake…”);
	}
}</code></pre><h3 id="command-l-interfaccia"><strong><strong>Command, </strong>l'interfaccia</strong></h3><pre><code class="language-java">public interface Command {
	public abstract void execute();
}</code></pre><h3 id="order-il-comando-concreto"><strong><strong>Order, </strong>il comando concreto</strong></h3><pre><code class="language-java">public class Order implements Command {
	private Chef chef;
	private String food;

	public Order(Chef chef, String food) {
		this.chef = chef;
		this.food = food;
	}

	@Override
	public void execute() {
		if (this.food.equals(“Pasta”)) {
			this.chef.cookPasta();
		} else {
			this.chef.bakeCake();
		}
	}
}</code></pre><h3 id="waiter-il-chiamante"><strong><strong>Waiter, </strong>il chiamante</strong></h3><pre><code class="language-java">public class Waiter {
	private Order order;

	public Waiter(Order ord) {
		this.order = ord;
	}

	public void execute() {
		this.order.execute();
	}
}</code></pre><h2 id="tu-il-cliente"><strong>Tu, il<strong> client</strong>e</strong></h2><pre><code class="language-java">public class Client {
	public static void main(String[] args) {
		Chef chef = new Chef();
        
		Order order = new Order(chef, “Pasta”);
		Waiter waiter = new Waiter(order);
		waiter.execute();

		order = new Order(chef, “Cake”);
		waiter = new Waiter(order);
		waiter.execute();
	}
}</code></pre><p>Come puoi vedere qui sopra, il cliente (<code>Client</code>) dà un ordine (<code>Order</code>) e imposta il destinatario (<code>Chef</code>) L'ordine è inviato al cameriere (<code>Waiter</code>), che saprà quando eseguirlo, vale a dire quando dare allo chef l'ordine di preparare il piatto. Quando viene eseguito il chiamante, viene invocato il metodo <code>execute</code> dell'ordine (<code>Order</code>) sul destinatario (vale a dire che <code>Chef</code> riceve il comando di cucinare la pasta - <code>cookPasta()</code> - oppure di infornare un dolce - <code>bakeCake()</code>).</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/italian/news/content/images/2023/02/command-pattern-run-example-1.png" class="kg-image" alt="command-pattern-run-example-1" width="553" height="104" loading="lazy"><figcaption>Risultato dell'esempio del pattern Command</figcaption></figure><h2 id="veloce-riepilogo"><strong>Veloce riepilogo</strong></h2><p>In questo post abbiamo esaminato:</p><ol><li>Cosa è un design pattern,</li><li>I diversi tipi di design pattern e perché sono differenti</li><li>Un design pattern comune o di base per ciascun tipo</li></ol><p>Spero che questo sia stato utile.</p><p>Puoi trovare il repository del codice per questo post <a href="https://github.com/samsam-026/Design_Patterns">qui</a>.</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
