[JAVA] Ich habe das Zustandsmuster und das Strategiemuster studiert

Jedermann. Dies ist der letzte Tag des Jahres. Ich habe vor ungefähr einem Monat in meinem Blog erklärt, dass ich innerhalb des Jahres wieder bei Qiita posten werde, und ich habe mich schließlich entschlossen, ganz am Ende des Jahres zu posten: heat_smile:

Normalerweise lerne ich hauptsächlich C #, aber die meisten Designmusterbücher waren JAVA, also habe ich mein Bestes versucht, mit JAVA zu schreiben.

Als unerfahrener Mensch habe ich dieses Jahr endlich etwas über "Designmuster" gelernt.

Das Designmuster schockierte mich genauso wie Vegitas Urknallangriff. Ich habe den Unterschied zwischen Staat und Strategie nicht wirklich verstanden, deshalb werde ich ihn selbst zusammenfassen. Entschuldigung, wenn das nicht stimmt.

Staat ist ein Staat und bewegt sich extern oder intern. Strategie ist eine Strategie, die extern entscheidet, welche Strategie zu verfolgen ist

Ich fühlte mich so.

Also kaufte ich diese beiden Muster dieses Mal mit einer Person namens Kyosuke Shindo. Bitte beachten Sie, dass es etwas länger dauern kann.

Zunächst zum Programm.

Es gibt nur eine Person, Kyosuke Shindo. Kyosuke Shindo entscheidet, ob er normal oder hart arbeitet. (Strategie) Und Sie erhalten Erfahrungswert durch Arbeit, und Kyosuke Shindo wird durch diesen Erfahrungswert höher eingestuft. (Zustand)

Es ist ein dummes Programm.

Schreiben Sie zuerst von Main, um ausgeführt zu werden.

Main.java



package Kyosuke;

public class Main {
	
	public static void main(String[] args) {
		Human kyosuke = new Kyosuke();
		//Arbeite und sammle 1 Erfahrung
		kyosuke.DoWork();
		//Arbeite hart und erhalte 3 Erfahrungspunkte
		kyosuke.ChangeWorkStyle(new HardWork());
		kyosuke.DoWork();
		//Immerhin arbeite ich normal
		kyosuke.ChangeWorkStyle(new NomalWork());
		kyosuke.DoWork();
		kyosuke.DoWork();
		kyosuke.DoWork();
		//Ich meine es ernst von heute w
		kyosuke.ChangeWorkStyle(new HardWork());
		kyosuke.DoWork();
		kyosuke.DoWork();
		kyosuke.DoWork();
		kyosuke.DoWork();
		kyosuke.DoWork();
		kyosuke.DoWork();
		
	}
}



Rang ist jetzt B Rang
Ich habe 1 Erfahrung, weil ich normal gearbeitet habe
Ich habe 3 Erfahrungspunkte bekommen, weil ich hart gearbeitet habe
Ich habe 1 Erfahrung, weil ich normal gearbeitet habe
Ich habe 1 Erfahrung, weil ich normal gearbeitet habe
Ich habe 1 Erfahrung, weil ich normal gearbeitet habe
Ich habe 3 Erfahrungspunkte bekommen, weil ich hart gearbeitet habe
Rang ist jetzt Ein Rang
Ich habe 3 Erfahrungspunkte bekommen, weil ich hart gearbeitet habe
Ich habe 3 Erfahrungspunkte bekommen, weil ich hart gearbeitet habe
Ich habe 3 Erfahrungspunkte bekommen, weil ich hart gearbeitet habe
Ich habe 3 Erfahrungspunkte bekommen, weil ich hart gearbeitet habe
Ich war in der Lage
Ich habe 3 Erfahrungspunkte bekommen, weil ich hart gearbeitet habe
Ich war in der Lage

Der erste Rang ist B-Rang. Und Arbeit ist auch normal. Ich arbeite hart auf dem Weg und der Rang steigt und endlich kann ich zuschlagen

Schauen wir uns eine Person namens Kyosuke Shindo an.

Human.java



package Kyosuke;

interface Human {
	void DoWork();
	void SetRank(Rank newRank);
	void ChangeWorkStyle(Work style);
	int GetExperiencepoint();
}


Kyosuke.java



package Kyosuke;

public class Kyosuke implements Human{
	private Rank rank;
	private Work work;
	private int experiencepoint;

	public Kyosuke() {
		this.rank = new BRank(this);
		this.work = new NomalWork();
		//Erleben Sie zuerst Wert 1
		this.experiencepoint = 1;
	}
	
	@Override
	public void DoWork() {
		int point = work.DoWork();
		this.experiencepoint += point;
		//Überprüfen Sie den Rang hier
		rank.CheckNextRank();
	}

	@Override
	public void SetRank(Rank newRank) {
		this.rank = newRank;
	}

	@Override
	public void ChangeWorkStyle(Work style) {
		this.work = style;
	}

	@Override
	public int GetExperiencepoint() {
		return this.experiencepoint;
	}
}


Es hat einen Rang, der den aktuellen Rang darstellt, eine Arbeit, die einen Job darstellt (dh unbekannt), und einen Erfahrungspunkt.

Initialisieren Sie alle diese im Konstruktor. Aktionen, die tatsächlich funktionieren, Aktionen, die den Rang ändern, Aktionen, die den Arbeitsstil ändern, Aktionen, die Erfahrungswerte zurückgeben Überschreiben Sie diese.

Jetzt werde ich über den Arbeitsstil schreiben.

Work.java


package Kyosuke;

public abstract class Work {
	public abstract int DoWork();
}

NomalWork.java


package Kyosuke;
public class NomalWork extends Work{
	private final int experiencePoint =1;
	@Override
	public int DoWork() {
		System.out.println("Ich habe 1 Erfahrung, weil ich normal gearbeitet habe");
		return experiencePoint;
	}
}

HardWork.java


package Kyosuke;
public class HardWork extends Work{
	private final int experiencePoint = 3;
	@Override
	public int DoWork() {
		System.out.println("Ich habe 3 Erfahrungspunkte bekommen, weil ich hart gearbeitet habe");
		return experiencePoint;
	}
}

Wenn Sie einfach arbeiten, wird dies Ihre Erfahrung zurückgeben. Wenn Sie dieses Muster nicht verwenden, benötigen Sie eine if-Anweisung und eine switch-Anweisung. Die spezifische Verarbeitung kann einfach umgeschaltet werden, indem sie in eine Unterklasse implementiert wird.

Rank.java


package Kyosuke;

public abstract class Rank {
	protected int experinencepoint;
	protected int nextLeve;
	protected Human human;
	
	public Rank(Human human){
		this.human = human;
	}

	protected void SetExperinencepoint(){
		this.experinencepoint =human.GetExperiencepoint();
	}

	protected abstract void CheckNextRank();
}

Und Rang. Das ist der Staat. Der Erfahrungswert von Kyosuke Shindo wird im Rang ausgedrückt. Der Konstrukteur erhält Kyosuke Shindo.

BRank.java


package Kyosuke;

public class BRank extends Rank{
	public BRank(Human human){
		super(human);	
		this.nextLeve = 8;
		System.out.println("Rang ist jetzt B Rang");
	}
	@Override
	protected void CheckNextRank() {
		//Überprüfen Sie zunächst den Erfahrungswert
		SetExperinencepoint();
		//Level aufsteigen, wenn der Erfahrungswert das nächste Level überschreitet
		if (experinencepoint > nextLeve){
			human.SetRank(new ARank(this.human));
		}
	}
	
}

Die Unterklasse "Rang" überschreibt die erforderliche Methode. Rufen Sie im Konstruktor den Konstruktor der übergeordneten Klasse auf und legen Sie Kyosuke Shindo fest. Und setze nextLeve so, dass du 8 Erfahrungswerte bis zum nächsten Level benötigst (What is Next Leve)

Der Punkt ist die CheckNextRank-Methode. Wir lesen den Erfahrungswert von Kyosuke Shindo und ändern den Zustand entsprechend. Speziell SetExperinencepoint(); Wenn der Erfahrungswert mit gelesen wird und die Bedingung der nächsten im Konstruktor festgelegten Ebene überschritten wird, wird der Rang auf den Rang A erhöht. (Ändert den Zustand)

Auf der Seite der Hauptmethode ist es überhaupt nicht an dieser Zustandsänderung beteiligt. Alles bewegt sich intern.

ARank.java


package Kyosuke;

public class ARank extends Rank{
	public ARank(Human human){
		super(human);
		nextLeve = 20;
		System.out.println("Rang ist jetzt Ein Rang");
	}
	
	@Override
	protected void CheckNextRank() {
		//Überprüfen Sie zunächst den Erfahrungswert
		SetExperinencepoint();
		//Level aufsteigen, wenn der Erfahrungswert das nächste Level überschreitet
		if (experinencepoint > nextLeve){
			System.out.println("Ich war in der Lage");
		}
	}
	
}


Und ARank empfängt auch Kyosuke Shindo im Konstruktor. Der Verarbeitungsinhalt ist der gleiche wie bei BRank. Wenn Sie ohne Neigung zu BRank zurückkehren oder auf eine höhere Ebene gehen möchten, können Sie Kyosuke Shindo auf die gleiche Weise übergeben.

Ich habe es sehr einfach zusammengestellt, aber das war's.

Das Designmuster war magisch. Er ist auch so ein Lehrer, der mich denken lässt, dass ich immer mehr lernen sollte.

Nun, plötzlich Nächstes Jahr wird es arbeitslos: schwer:

Wie auch immer, ich werde üben und mein Bestes geben, damit ich durch Programmieren essen kann.

Recommended Posts

Ich habe das Zustandsmuster und das Strategiemuster studiert
Ich habe den Konstruktor (Java) studiert.
Strategiemuster
Strategiemuster
Was für eine Strategiemusterfabrik, kein Staat
Ich habe versucht, das Iterator-Muster zu implementieren
[Rails] Ich habe den Unterschied zwischen neuer Methode, Speichermethode, Erstellungsmethode und Erstellungsmethode untersucht.
[Java] Strategiemuster
Studiere 3 Wochen und bestehe Java Bronze
Entwurfsmuster ~ Zustand ~
Entwurfsmuster ~ Strategie ~
Ich habe die Eigenschaften von Java und .NET verglichen
[Ruby] Ich habe über den Unterschied zwischen each_with_index und each.with_index nachgedacht
[Rails] Ich habe den Unterschied zwischen Ressourcen und Ressourcen untersucht
Ich habe die Typen und Grundlagen von Java-Ausnahmen zusammengefasst
Unterschied zwischen i ++ und ++ i
Ich kann die Installation nach dem Ändern der Ruby-Version nicht bündeln
[Java] Ändern Sie die Verarbeitung entsprechend der Situation mit dem Strategiemuster
Ich habe das Verhalten von Java Scanner und .nextLine () nicht wirklich verstanden.
Ich möchte Tomcat auf den Server bringen und die Anwendung starten
Ich möchte eine Methode aufrufen und die Nummer zählen
Ich habe JAX-RS ausprobiert und mir das Verfahren notiert
Erläutern Sie die Vorzüge des staatlichen Musters anhand des Bewertungsurteils des Films
Ich möchte im gespeicherten Zustand zum selben Bildschirm wechseln
Verstehen Sie das Iterator-Muster, indem Sie Java- und JavaScript-Code vergleichen
[Java] Ich habe über die Vorzüge und Verwendungen von "Schnittstelle" nachgedacht.