JavaRush /Java Blog /Random-IT /Strategia del modello (Strategia)

Strategia del modello (Strategia)

Pubblicato nel gruppo Random-IT
Il modello Strategy definisce una famiglia di algoritmi, incapsula ciascuno di essi e garantisce che siano intercambiabili. Permette di modificare gli algoritmi indipendentemente dal loro utilizzo lato client (questa definizione è tratta dal libro “Head First. Design Patterns” di Eric Freeman e Elizabeth Robson). Questa definizione sembra un po' confusa, quindi dobbiamo spiegarla in modo più dettagliato nel linguaggio normale . Cominciamo con la religione :) Esistono molte religioni nel mondo (confessioni, movimenti, credenze, ecc.). Come potremmo descriverlo nel codice. Ebbene, ad esempio, potremmo prendere il corso Religione ed ereditare da esso altre religioni. Eliminiamo le cose inutili e utilizziamo un metodo believe() nella classe Religion.
public abstract class Religion {
    public void believe() {
        System.out.println("Я верю в Бога-творца этого мира");
    }
}
Tutte le altre religioni possono essere ereditate da questa classe. Se ci fossimo limitati al cristianesimo e anche all’islam e all’ebraismo, non ci sarebbero stati problemi.
public class Judaism extends Religion {
}
public class Islam extends Religion {
}
public class Christianity extends Religion {
}
Ma se si pensa alle altre religioni che esistono adesso (o che esistevano prima, ma sono scomparse), allora sorgeranno problemi, almeno con i buddisti. Dovrai sovrascrivere il loro metodo di convinzione.
public class Buddhism extends Religion {
    @Override
    public void believe() {
        System.out.println("Есть Бог or боги or нет, это не важно, главное достичь нирваны :)");
    };
}
E poiché ci sono molte religioni e credono persino nel mostro della pasta (Pastafarianesimo), allora in tutte queste religioni dovrai ridefinire il metodo di credenza. Ma possiamo farlo diversamente, spostare questo metodo sull'interfaccia Faith e implementarvi il metodo believe e implementare questo metodo in ogni classe (e di conseguenza implementarlo in ogni classe come desideriamo)? Ma poi otterremo la duplicazione del codice, almeno tra ebrei e cristiani. I musulmani di Dio possono scrivere in arabo.
public interface Faith {
    public void believe();
}
public class Christianity implements Faith {
    @Override
    public void believe() {
        System.out.println("Я верю в Бога-творца этого мира");
    }
}
public class Judaism implements Faith {
    @Override
    public void believe() {
        System.out.println("Я верю в Бога-творца этого мира");
    }
}
Implementare il metodo predefinito non aiuterà molto in questo caso; ci sono così tante religioni che anche se definisci questo metodo per impostazione predefinita nell'interfaccia Fede, dovrai implementare questo metodo a modo tuo in tutte le religioni non monoteiste e ripeterlo in qualche luogo. Cosa ci offre il modello Strategy in questo caso: offre la creazione di classi modello già pronte per l'interfaccia attuale, che verranno poi sostituite nel costruttore di una religione specifica. Quelli. definire e creare la stessa famiglia di algoritmi menzionata all'inizio della definizione.
public interface Faith {
    public void believe();
}
public class AbrahamicReligion implements Faith {
    @Override
    public void believe() {
        System.out.println("Я верю в Бога-творца этого мира");
    }
}
public class BuddismReligion implements Faith {
    @Override
    public void believe() {
        System.out.println("Есть Бог or боги or нет, это не важно, главное достичь нирваны :)");
    }
}
public class JediismReligion implements Faith {
    @Override
    public void believe() {
        System.out.println("Да пребудет с вами Сила!");
    }
}
E in ogni classe del costruttore, sostituiscili.
public abstract class Religion {
    Faith faith;
}
public class Judaism extends Religion{

    public Judaism() {
        this.faith = new AbrahamicReligion();
    }
}
public class Christianity extends Religion{

    public Christianity() {
        this.faith = new AbrahamicReligion();
    }
}
public class Buddhism extends Religion {

    public Buddhism() {
        this.faith = new BuddismReligion();
    }
}
Pertanto, se devi includere un'altra religione nel tuo progetto, non dovrai ridefinire il metodo di credenza per tutte le classi o parti di classi. E dovrai solo implementare la classe mancante (se non ce n'è già) che implementa l'interfaccia Faith e aggiungere questa classe nel costruttore della nuova religione.
public class PastafarianismReligion implements Faith{

    @Override
    public void believe() {
        System.out.println("Кто съел мои макароны???");
    }
}
public class Pastafarianism extends Religion {

    public Pastafarianism() {
        this.faith = new PastafarianismReligion();
    }
}
Commenti
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION