JavaRush /Java-Blog /Random-DE /Vorlagestrategie (Strategie)

Vorlagestrategie (Strategie)

Veröffentlicht in der Gruppe Random-DE
Das Strategiemuster definiert eine Familie von Algorithmen, kapselt jeden von ihnen und stellt sicher, dass sie austauschbar sind. Es ermöglicht die Modifikation von Algorithmen unabhängig von ihrer Verwendung auf der Client-Seite (diese Definition ist dem Buch „Head First. Design Patterns“ von Eric Freeman und Elizabeth Robson entnommen). Diese Definition sieht etwas verwirrend aus, daher müssen wir sie in normaler Sprache ausführlicher erklären . Beginnen wir mit der Religion :) Es gibt viele Religionen auf der Welt (Konfessionen, Bewegungen, Überzeugungen usw.). Wie könnten wir das im Code beschreiben? Nun, wir könnten zum Beispiel den Religionskurs belegen und daraus andere Religionen erben. Lassen Sie uns das Unnötige abstrahieren und eine believe()-Methode in der Religionsklasse verwenden.
public abstract class Religion {
    public void believe() {
        System.out.println("Я верю в Бога-творца этого мира");
    }
}
Alle anderen Religionen können von dieser Klasse geerbt werden. Wenn wir uns auf das Christentum und sogar auf den Islam und das Judentum beschränkt hätten, hätte es keine Probleme gegeben.
public class Judaism extends Religion {
}
public class Islam extends Religion {
}
public class Christianity extends Religion {
}
Aber wenn man an die anderen Religionen denkt, die jetzt existieren (oder früher existierten, aber verschwunden sind), dann werden Probleme auftreten, zumindest bei Buddhisten. Sie müssen ihre Glaubensmethode überschreiben.
public class Buddhism extends Religion {
    @Override
    public void believe() {
        System.out.println("Есть Бог oder боги oder нет, это не важно, главное достичь нирваны :)");
    };
}
Und da es viele Religionen gibt und sie sogar an das Nudelmonster (Pastafarianismus) glauben, müssen Sie in all diesen Religionen die Glaubensmethode neu definieren. Aber können wir es anders machen, diese Methode in die Faith-Schnittstelle verschieben und darin die believe-Methode implementieren und diese Methode in jeder Klasse implementieren (und sie dementsprechend in jeder Klasse implementieren, wie wir es wünschen)? Aber dann wird es eine Vervielfältigung des Codes geben, zumindest unter Juden und Christen. Muslime Gottes können auf Arabisch schreiben.
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("Я верю в Бога-творца этого мира");
    }
}
Die Implementierung der Standardmethode hilft hier nicht viel; es gibt so viele Religionen, dass Sie diese Methode, selbst wenn Sie diese Methode standardmäßig in der Glaubensschnittstelle definieren, in allen nicht-monotheistischen Religionen auf Ihre eigene Weise implementieren und wiederholen müssen irgendwo. Was bietet uns das Strategiemuster in diesem Fall: Es bietet die Möglichkeit, vorgefertigte Vorlagenklassen für die aktuelle Schnittstelle zu erstellen, die dann in den Konstruktor einer bestimmten Religion eingesetzt werden. Diese. Definieren und erstellen Sie dieselbe Familie von Algorithmen, die zu Beginn der Definition erwähnt wurde.
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("Есть Бог oder боги oder нет, это не важно, главное достичь нирваны :)");
    }
}
public class JediismReligion implements Faith {
    @Override
    public void believe() {
        System.out.println("Да пребудет с вами Сила!");
    }
}
Und ersetzen Sie sie in jeder Klasse im Konstruktor.
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();
    }
}
Wenn Sie also eine andere Religion in Ihr Projekt einbeziehen müssen, müssen Sie die Glaubensmethode nicht für alle Klassen oder Teile von Klassen neu definieren. Und Sie müssen nur die fehlende Klasse implementieren (falls noch keine vorhanden ist), die die Faith-Schnittstelle implementiert, und diese Klasse im Konstruktor der neuen Religion hinzufügen.
public class PastafarianismReligion implements Faith{

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

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