Tecniche di Problem-Solving Design Patterns Tecniche di Problem-Solving in Java JUG-Cagliari 19.06.2004 Ing. Nicola Cubeddu cubo@janthas.com www.janthas.com
Design Patterns Cosa sono i Design Patterns? Classificazione Tre esempi Conclusioni
Cosa e’ un pattern? 1/2 E’ possibile pensare ad un pattern come un modo di risolvere una particolare classe di problemi. Un design pattern e’ una descrizione di come devono comunicare oggetti e classi che saranno customizzate per risolvere un problema generale di design in un particolare contesto. Serve per aggiungere un maggiore livello di astrazione all’architettura del progetto ed a modellizzare meglio gli oggetti e le interazioni tra gli oggetti
Cosa e’ un pattern? 2/2 Non descrive un concreto design ne una concreta implementazione Serve a sviluppare un progetto in modo elegante e facile da mantenere Aiuta i nuovi progettisti meno esperti ad avere un design piu flessibile e riusabile L’obbiettivo dei design patterns e’ isolare i cambiamenti nel codice in modo da rendere facile l’evoluzione del progetto
Classificazione 1/2 Creational: definisce la modalita’ di creazione degli oggetti Structural: definisce l’aggregazione di oggetti per formare structure piu vaste Behavioral: definisce gli oggetti per soddisfare particolari vincoli nel loro comportamento
Classificazione 2/2 Creational: Factory, Singleton, Builder, Prototype Structural: Adapter, Bridge, Composite, Decorator, Facade, Flyweight, Proxy Behavioral: Chain of Responsibility, Command, Interpreter, Iterator, Mediator, Memento, Observer, State, Strategy, Template, Visitor
Observer 1/3 Il pattern observer risolve un comune problema: cosa fare se un gruppo di oggetti necessitano di essere aggiornati quando altri oggetti cambiano stato? Il cambiamento di un oggetto provoca dinamicamente il cambiamento di altri oggetti. Un oggetto dovrebbe poter notificare ad altri oggetti il cambiamento del proprio stato senza conoscere nulla sulla loro identità. Il meccanismo ad eventi di AWT e’ implementato addottando il pattern Observer.
Observer 2/3
Observer 3/3 public interface Observer { public void update( Subject subject ) ; } public class Subject { protected Vector observers = new Vector() ; public void addObserver( Observer o ) { observers.addElement( o ) ; public void removeObserver( Observer o ) { observers.removeElement( o ) ; public void notify() { Enumeration e = observers.getElements() ; while ( e.hasMoreElements() ) { ((Observer)e.nextElement()).update( this ) ;
Factory 1/4 Il pattern Factory definisce una interfaccia per la creazione di un oggetto, ma lascia alle sottoclassi la decisione su che classe istanziare. Fornisce un’interfaccia per la creazione di oggetti senza specificare la loro classe. Il pattern Factory e’ applicabile in tutti quei casi in cui si vuole centralizzare la decisione di quale classe istanziare.
Factory 2/4
Factory 3/4 public interface AbstractFactory { public AbstractProductA createProductA(); public AbstractProductB createProductB(); } public class ConcreteFactory1 implements AbstractFactory { public AbstractProductA createProductA() { return (AbstractProductA ) new ProductA1(); public AbstractProductB createProductB() { return (AbstractProductB ) new ProductB1(); public class ConcreteFactory2 implements AbstractFactory { return (AbstractProductA ) new ProductA2(); return (AbstractProductB ) new ProductB2();
Factory: 4/4
Proxy 1/4 Il pattern Proxy fornisce un sostituto di un oggetto per controllare l’accesso ad esso. Un remote proxy puo nascondere il fatto che l’oggetto risiede in un altro server CORBA ed RMI (Remote Method Interface) sono implementati tramite il Pattern Proxy.
Proxy 2/4
Proxy 3/4 abstract class Subject { abstract public void Request(); } class RealSubject extends Subject { public void Request() { // do something class ProxySubject extends Subject { private RealSubject _subject = null; if (_subject == null) { _subject = new RealSubject(); _subject.Request();
Proxy 4/4 // Share interface client/server public interface Action { public void doAction(); } // Remote action (on server) public class ConcreteAction implements Action { public void doAction() { //... // Client proxy public class ActionStub implements Action { // Send Tcp/Ip order for calling remote doAction
Conclusioni Al momento le software house utilizzano in modo esteso i pattern nella progettazione architetturale di progetti software. “Analysis Patterns: reusable object models”, Martin Fowler ”Thinking in Patterns”, Bruce Eckel http://www.Mindview.net “Design Patterns in Java”, Metsker Steven John - Addison Wesley