[Strategy Pattern] Semplice esercizio

di il
10 risposte

[Strategy Pattern] Semplice esercizio

Devo rimodellare questo sistema utilizzando il pattern specificato.



La criticità che mi è stata chiesta di trovare credo sia che ogni volta che viene estesa la classe EssereVivente, per ogni classe bisogna effettuare l'override del metodo cammina. Quindi secondo lo Strategy, la strategia consiste nel creare un'interfaccia CamminataStrategy che verrà implementata da varie classi concrete in base ai diversi modi di camminare.
Non capisco dove impostare la tipologia di Camminata delle classi.
Tramite il costruttore o un metodo set?? La camminata dell'uomo dipende anche dall'età.

Ciao e buona domenica

Una possibile soluzione in UML anche se devo tradurlo in Java.

10 Risposte

  • Re: [Strategy Pattern] Semplice esercizio

    Personalmente opterei per un metodo set, eventualmente richiamato dall'apposito costruttore se necessario.
    P.S. Una pianta che cammina?
  • Re: [Strategy Pattern] Semplice esercizio

    La pianta cammina nel terreno radicando le radici vabbé é un esempio.
    Un metodo set che richiamo nel costruttore quindi. Ma per l'uomo dove il metodo cammina dipende dall'etá? Dovrei creare altre tre classi che implementano l'interfaccia per tutti e tre gli intervalli temporali della vita umana ed inserirli in uno switch??
  • Re: [Strategy Pattern] Semplice esercizio

    Curiosità: ma davvero vi fanno perdere tempo con queste... diciamo così... ehm... bippppp?
  • Re: [Strategy Pattern] Semplice esercizio

    Paolovox ha scritto:


    La pianta cammina nel terreno radicando le radici vabbé é un esempio.
    Ah ecco. Era un pò inquietante però.
    Un metodo set che richiamo nel costruttore quindi. Ma per l'uomo dove il metodo cammina dipende dall'etá? Dovrei creare altre tre classi che implementano l'interfaccia per tutti e tre gli intervalli temporali della vita umana ed inserirli in uno switch??
    E' sufficiente un metodo setEta() nella classe concreta Uomo, oppure lo passi come parametro del costruttore della classe concreta Uomo.
  • Re: [Strategy Pattern] Semplice esercizio

    Si ci insegnano i design pattern: Observer, Strategy, Singleton, Factory, Builder e alcuni esempi sia banali che no su dove applicarli.

    Perchè reputi che siano una perdita di tempo? Cosa mi consigli?
  • Re: [Strategy Pattern] Semplice esercizio

    Questo è in java:

    === Interfaccia Strategy ===
    
    public interface CamminataStrategy{ void cammina();}
    
    ===ConcreteStrategy ===
    
    public class CamminataStrategyMillepiede implements CamminataStrategy{
    	public void cammina(){System.out.print("Cammino a 1234 zampe");}
    }
    
    === Classe astratta EssereVivente ===
    
    public class abstract EssereVivente implements CamminataStrategy{}
    
    Adesso dopo che ho una sfilza di classi concrete che implementano CamminataStrategy in una classe posso scegliere quale utilizzare ma in che modo?

    === I MODO ===
    
    public class Millepiedi extends EssereVivente{
    	private CamminataStrategy c = new CamminataStrategyMillepiedi();
    	
    	@Override
    	public void cammina(){ c.cammina();}
    }
    

    === II MODO ===
    
    public class Millepiedi extends EssereVivente{
    	private CamminataStrategy c;
    	
    	public Millepiedi(CamminataStrategy c){this.c = c;}
    	
    	@Override
    	public void cammina(){ c.cammina();}
    }
    
  • Re: [Strategy Pattern] Semplice esercizio

    Paolovox ha scritto:


    Si ci insegnano i design pattern: Observer, Strategy, Singleton, Factory, Builder e alcuni esempi sia banali che no su dove applicarli.

    Perchè reputi che siano una perdita di tempo? Cosa mi consigli?
    Nono, evidentemente hanno preso un certo libro come "testo" e seguono la strada canonica.
    Mera curiosità
  • Re: [Strategy Pattern] Semplice esercizio

    === Classe astratta EssereVivente ===
    public class abstract EssereVivente implements CamminataStrategy{}
    No! Stai sbagliando strategia (in tutti i sensi)
    dev'essere:
    
    
    interface CamminataStrategy {
        public void cammina();
    }
    
    Interface AbstractEssere vivente {
        public void cammina();
    }
    
    class MillePiedi implements CamminataStrategy {
        public void cammina() { System.out.println("Sono un millepiedi"); }
    }
    
    class Pianta implements CamminataStrategy {
        public void cammina() { System.out.println("Sono una pianta"); }
    }
    
    class Uomo implements CamminataStrategy {
        public void cammina() { System.out.println("Sono un uomo"); }
    }
    
    class Zombie implements CamminataStrategy {
        public void cammina() { System.out.println("Sono uno zombie"); }
    }
    
    
    class EssereVivente implements AbstractEssereVivente {
        private CamminataStrategy cs;
        public EssereVivente() {} 
        public EssereVivente(CamminataStrategy csbase) {
            this.set_strategy(csbase); // centralizza la chiamata
        } 
    
        public set_strategy(CamminataStrategy csbase) {
            this.cs = csbase; 
        } 
    
        public cammina() {
            if (this.cs) this.cs.cammina();
        }
    }
    
    ***
    public static void main etc..
    
    EssereVivente cosa = new EssereVivente(/* posso passare una strategia iniziale o no */);
    cosa.cammina();
    cosa.set_strategy(new Millepiedi());
    cosa.cammina();
    cosa.set_strategy(new Uomo());
    cosa.cammina();
    cosa.set_strategy(new Pianta());
    cosa.cammina();
    cosa.set_strategy(new Zombie());
    cosa.cammina();
    
    
  • Re: [Strategy Pattern] Semplice esercizio

    In effetti stavo creando un factory di Camminate -.-
    Quindi EssereVivente sarebbe il context del pattern Strategy, e il client decide con quale strategia (algoritmo), far camminare un essere vivente e non ci interessa di per se il tipo di essere vivente.
    Adesso mi risulta molto più chiaro, grazie mille.
    L'unica cosa, EssereVivente non avrebbe potuto implementare anche lui CamminataStrategy o è concettualmente sbagliato??
  • Re: [Strategy Pattern] Semplice esercizio

    L'unica cosa, EssereVivente non avrebbe potuto implementare anche lui CamminataStrategy o è concettualmente sbagliato??
    Direi che concettualmente è sbagliato. In casi del genere bisogna farsi guidare dal concetto "è un" oppure "ha un".
    Un essere vivente ha una sua camminata, non è una camminata.
    Volendo anche i sassi "camminano" ma non per questo sono esseri viventi.
Devi accedere o registrarti per scrivere nel forum
10 risposte