[BIGNAMI] Design Patterns in Java – Parte 3

§INTERFACE PATTERNS§ – FACADE pattern

La programmazione OO permette di creare toolkits e sottosistemi di carattere generico, che possono poi essere sfruttati da applicazioni legate ad uno specifico dominio.
Tali sottosistemi espongono spesso interfacce complesse e molto diverse fra loro, l’intento del pattern FACADE è di fornire un’interfaccia che renda il sottosistema facile da usare, esponendo una interfaccia più semplice.

Una classe facade può avere tutti metodi statici, in questo caso è chiamata classe utility (in UML).

La classe JOptionPane (javax.swing package) è uno dei pochi esempi di facade contenuto nelle librerie di classi Java:
questa classe semplifica la creazione di un dialog box pop up.

[BIGNAMI] Design Patterns in Java – Parte 2

§INTERFACE PATTERNS§ – ADAPTER Pattern

Un oggetto è un client se ha necessità di chiamare il tuo codice.
Lo scopo del pattern ADAPTER è quello di esporre al cliente una interfaccia a lui nota per sfruttare servizi di classi con differenti interfacce.

Il pattern ADAPTER consente di utilizzare una classe esistente per soddisfare le esigenze di un client.

Se il client specifica i requisiti in un’interfaccia, si sfrutta tale interfaccia per la classe adapter: l’adapter implementerà l’interfaccia nota al client e allo stesso tempo estenderà la classe che contiene i metodi richiesti, ma con diversa signature. Questo approccio crea un class adapter che traduce le chiamate del client in chiamate ai metodi della classe esistente.

Quando il client non specifica l’interfaccia, si può applicare il pattern creando una sottoclasse del client che usa una istanza della classe esistente.
Questo approccio crea un object adapter che inoltra le chiamate a un’istanza della classe client esistente. Questo
approccio può essere pericoloso, soprattutto se non si fa override di tutti i metodi che il cliente potrebbe chiamare.

Esempio

Adapting to an Interface
Una classe client fa chiamate al metodo requiredMethod() che è dichiarato in una interfaccia. In una classe esistente si ha già implementato il metodo usefulMethod(),
che soddisfa le esigenze del client. Si può creare una adapter class creando una nuova classe, NewClass(), che estenda la classe esistente (ExistingClass) e implementi l’interfaccia che il client si aspetta
(RequiredInterface).

class adapter

class adapter

Class and Object Adapters
Quando il client non dichiara i metodi *da adattare* in una interfaccia, si può sfruttare un object adapter: un adapter che usa la delegazione al posto dell’ereditarietà.

object adapter

object adapter

NewClass è un esempio di object adapter.
Un’istanza di questa classe è un’istanza della classe RequiredClass. In altre parole,
la classe NewClass soddisfa le esigenze del cliente. La classe NewClass è in grado di adattarsi alla classe ExistingClass per soddisfare le esigenze del cliente, utilizzando un’istanza di ExistingClass.

[BIGNAMI] Design Patterns in Java – Parte 1

Il libro di riferimento è: Design Patterns in Java(TM) (Software Patterns Series) by Steven John Metsker.

Un pattern è *un modo per fare qualcosa*, una tecnica già sperimentata e consolidata per espletare un dato compito.

In modo analogo, un design pattern è un pattern che usa classi e metodi in un linguaggio object oriented per risolvere problemi noti.
Un pattern rappresenta una idea, non una particolare implementazione.

Si possono classificare i Design Patterns secondo i problemi che risolvono:
1. Interfacce (Interfaces)
2. Responsabilità (Responsibility)
3. Costruttori (Construction)
4. Operazioni (Operations)
5. Estensioni (Extensions)

In particolare:

  • Interfaces
    • ADAPTER
    • FACADE
    • COMPOSITE
    • BRIDGE
  • Responsibility
    • SINGLETON
    • OBSERVER
    • MEDIATOR
    • PROXY
    • CHAIN OF RESPONSIBILITY
    • FLYWEIGHT
  • Construction
    • BUILDER
    • FACTORY METHOD
    • ABSTRACT FACTORY
    • PROTOTYPE
    • MEMENTO
  • Operations
    • TEMPLATE METHOD
    • STATE
    • STRATEGY
    • COMMAND
    • INTERPRETER
  • Extensions
    • DECORATOR
    • ITERATOR
    • VISITOR
§INTERFACE PATTERNS§  – INTRODUZIONE ALLE INTERFACCE

Una interfaccia è una collezioni di metodi e variabili che rappresentano la parte visibile della classe che implementa l’interfaccia: in altra parola una interfaccia si può considerare come
*una dichiarazione di intenti*.

Una classe astratta senza metodi non abstract è simile ad una interfaccia, ma rimangono alcune differenze.
Differenze tra abstract classes e interfacce in Java:
– una classe può implementare più di una interfaccia ma non può estendere più di una classe abstract.
– una classe astratta può anche implementare metodi non astratti, mentre tutti i metodi di una interfaccia sono per forza astratti.
– una classe astratta può dichiarare e usare variabili di istanza, una interfaccia non può farlo, può solo creare constanti final e static.
– una classe astratta può avere diversi tipi di accesso ai metodi: public, protected, private o package (default). Tutti i metodi di una interfaccia sono implicitamente public.
– una classe astratta può definire costruttori, una interfaccia non può farlo.

Problema da risolvere e relativo pattern Interfaces:
– adattare l’interfaccia di una classe per corrispondere all’interfaccia che il cliente di aspetta: ADAPTER
– fornire una interfaccia semplice ad una collezioni di classi: FACADE
– definire una interfaccia che possa essere implementata sia da oggetti individuali sia da gruppi di oggetti: COMPOSITE
– disaccoppiare una astrazione dalla sua implementazione in modo che le due parti possano variare in modo indipendente: BRIDGE