[JAVA] J'ai écrit un modèle de conception dans l'édition Kotlin Builder

Pour apprendre le concept d'interface et la réutilisabilité des objets, qui sont importants dans l'orientation des objets ["Introduction aux modèles de conception appris en langage Java"](https://www.amazon.co.jp/%E5%A2%97% E8% A3% 9C% E6% 94% B9% E8% A8% 82% E7% 89% 88Java% E8% A8% 80% E8% AA% 9E% E3% 81% A7% E5% AD% A6% E3% 81% B6% E3% 83% 87% E3% 82% B6% E3% 82% A4% E3% 83% B3% E3% 83% 91% E3% 82% BF% E3% 83% BC% E3% 83% B3% E5% 85% A5% E9% 96% 80-% E7% B5% 90% E5% 9F% 8E-% E6% B5% A9 / dp / 4797327030 / ref = sr_1_1? __Mk_ja_JP =% E3% 82% AB % E3% 82% BF% E3% 82% AB% E3% 83% 8A & mots-clés = java% E8% A8% 80% E8% AA% 9E% E3% 81% A7% E5% AD% A6% E3% 81% B6 % E3% 83% 87% E3% 82% B6% E3% 82% A4% E3% 83% B3% E3% 83% 91% E3% 82% BF% E3% 83% BC% E3% 83% B3% E5 J'ai entendu parler de% 85% A5% E9% 96% 80 & qid = 1559563427 & s = gateway & sr = 8-1) et j'ai décidé d'écrire en kotlin en plus de Java. Cette fois, j'écrirai sur Builder.

Qu'est-ce que Builder

Lors de la construction d'une structure, il s'agit d'un modèle d'assemblage d'une instance avec une structure, tout comme elle est assemblée à chaque étape. L'exemple de programme traite d'une structure appelée phrases En supposant que le texte comporte les étapes et structures suivantes, nous définirons les méthodes qui composent chaque étape.

  1. Inclure un titre
  1. Contient des chaînes
  2. Comprend certains éléments à puces

Classe de constructeur

Une classe qui définit des méthodes pour composer des phrases.

Builder.java


abstract class Builder {
	public abstract void makeTitle(String title);
	public abstract void makeString(String str);
	public abstract void makeItems(String[] items);
	public abstract void close();
}

Builder.kt


abstract class Builder {
    abstract fun makeTitle(title: String)
    abstract fun makeString(str: String)
    abstract fun makeItems(items: Array<String>)
    abstract fun close()
}

Classe de réalisateur

Cette classe implémente la méthode construct pour construire une phrase. La classe Builder est transmise au constructeur, mais comme Builder est une classe abstraite, la sous-classe héritée est en fait incluse. Puisqu'il n'y a pas de déclaration de sous-classe spécifique, il n'y a pas de dépendances, De plus, le fait que les sous-classes peuvent être remplacées est appelé exchangeability.

Director.java


class Director {
	private Builder builder;
	public Director(Builder builder) {
		this.builder = builder;
	}
	public void construct() {
		builder.makeTitle("Greeting");
		builder.makeString("Du matin à midi");
		builder.makeItems(new String[] {
				"Bonjour.",
				"Bonjour."
		});
		builder.makeString("La nuit");
		builder.makeItems(new String[] {
				"Bonsoir.",
				"bonne nuit.",
				"Au revoir."
		});
		builder.close();
	}
}

Director.kt


class Director(builder: Builder) {
    private var b = builder
    fun construct(){
        b.makeTitle("Greeting")
        b.makeString("Du matin à midi")
        b.makeItems(arrayOf("Bonjour.", "Bonjour."))
        b.makeString("La nuit")
        b.makeItems(arrayOf("Bonsoir.", "bonne nuit.", "Au revoir."))
        b.close()
    }
}

Classe TextBuilder

Une classe qui crée des documents en utilisant du texte brut.

Quand j'ai écrit l'instruction for dans kotlin, j'ai d'abord écrit for (i: Int in 0..items.size -1), mais Comme for (i: Int in 0 until items.size), until ne compte pas les fractions, il convient donc aux opérations Array.

Référence: Développement Android avec Kotlin! Maintenons la syntaxe de base

Avec kotlin, vous pouvez écrire une méthode pratique appelée String Template (interpolation de chaîne). Vous pouvez incorporer une chaîne de caractères comme println (" $ a + $ b = $ {a + b} ") // 2 + 3 = 5.

Référence: Ce que les programmeurs Java trouvent utile avec Kotlin

TextBuilder.java


class TextBuilder extends Builder{
	private StringBuffer buffer = new StringBuffer();
	public void makeTitle(String title) {
		buffer.append("================================================\n");
		buffer.append(String.format("[%s]\n", title));
		buffer.append("\n");
	}
	public void makeString(String str) {
		buffer.append(String.format("■%s\n", str));
		buffer.append("\n");
	}
	public void makeItems(String[] items) {
		for (int i = 0; i < items.length; i++) {
			buffer.append(String.format("・%s\n", items[i]));
		}
		buffer.append("\n");
	}
	public void close() {
		buffer.append("================================================\n");
	}
	public String getResult() {
		return buffer.toString();
	}
}

TextBuilder.kt


class TextBuilder: Builder() {
    private var buffer = StringBuffer()
    override fun makeTitle(title: String) {
        buffer.append("================================================\n")
        buffer.append("[$title]\n")
        buffer.append("\n")
    }
    override fun makeString(str: String) {
        buffer.append("■$str\n")
        buffer.append("\n")
    }
    override fun makeItems(items: Array<String>) {
        for (i: Int in 0 until items.size) buffer.append("・${items[i]}\n")
        buffer.append("\n")
    }
    override fun close() {
        buffer.append("================================================\n")
    }
    fun getResult() = buffer.toString()
}

Classe HTMLBuilder

Une classe qui crée des documents à l'aide de fichiers HTML.

J'avais du mal à initialiser le membre écrivain avec la classe File, mais j'ai entendu dire que vous pouvez utiliser lateinit pour retarder la valeur qui change à mesure que le processus progresse. En outre, lateinit est recommandé comme «privé» car il est difficile d'y accéder de l'extérieur avant qu'il ne soit initialisé.

Référence: [Delay initialization with Kotlin](https://re-engines.com/2018/11/15/Delay initialization with kotlin /)

Vous pouvez obtenir le printWriter en utilisant java.io.File # printWriter (), il sera créé si le fichier n'existe pas, et écrasé s'il existe. Si vous voulez l'ajouter, utilisez ʻappendText () `.

Référence: E / S (fichier, réseau, etc.)

Si vous voulez changer le comportement en fonction de l'existence du fichier, utilisez java.io.File # createNewFile (): Boolean.

Référence: Kotlin - Créer un fichier - Exemples

HTMLBuilder.java


import java.io.*;

class HTMLBuilder extends Builder{
	private String filename;
	private PrintWriter writer;
	public void makeTitle(String title) {
		filename = title + ".html";
		try {
			writer = new PrintWriter(filename);
		} catch (IOException e) {
			e.printStackTrace();
		}
		writer.println(String.format("<html><head><title>%s</title></head><body>", title));
		writer.println(String.format("<h1>%s</h1>", title));
	}
	public void makeString(String str) {
		writer.println(String.format("<p>%s</p>", str));
	}
	public void makeItems(String[] items) {
		writer.println("<ul>");
		for (int i = 0; i < items.length; i++) {
			writer.println(String.format("<li>%s</li>", items[i]));
		}
		writer.println("</ul>");
	}
	public void close() {
		writer.println("</body></html>");
		writer.close();
	}
	public String getResult() {
		return filename;
	}
}

HTMLBuilder.kt


import java.io.File

class HTMLBuilder: Builder() {
    private var filename = String()
    private lateinit var writer:File
    override fun makeTitle(title: String) {
        filename = "$title.html"
        writer = File(filename)
        writer.printWriter().use { it.println("<html><head><title>$filename</title></head><body>") }
        writer.appendText("<h1>$title</h1>\n")
    }
    override fun makeString(str: String) {
        writer.appendText("<p>$str</p>\n")
    }
    override fun makeItems(items: Array<String>) {
        writer.appendText("<ul>\n")
        for (i: Int in 0 until items.size) writer.appendText("<li>${items[i]}</li>\n")
        writer.appendText("</ul>\n")
    }
    override fun close() {
        writer.appendText("</body></html>\n")
    }
    fun getResult() = filename
}

Classe principale

BuilderSample.java


public class BuilderSample {
	public static void main(String[] args) {
		if (args.length != 1) {
			usage();
			System.exit(0);
		}
		if (args[0].equals("plain")) {
			TextBuilder textbuilder = new TextBuilder();
			Director director = new Director(textbuilder);
			director.construct();
			String result = textbuilder.getResult();
			System.out.println(result);
		} else if (args[0].equals("html")) {
			HTMLBuilder htmlbuilder = new HTMLBuilder();
			Director director = new Director(htmlbuilder);
			director.construct();
			String filename = htmlbuilder.getResult();
			System.out.println(String.format("%s a été créé.", filename));
		} else {
			usage();
			System.exit(0);
		}
	}
	public static void usage() {
		System.out.println("Usage:java Création de document brut principal avec du texte brut");
		System.out.println("Usage:Création de document html principal java avec fichier HTML");
	}
}

BuilderSample.kt


fun main(args: Array<String>) {
    if (args.size != 1){
        usage()
        System.exit(0)
    }
    if (args[0] == "plain"){
        val textbuilder = TextBuilder()
        val director = Director(textbuilder)
        director.construct()
        val result = textbuilder.getResult()
        println(result)
    } else if (args[0] == "html") {
        val htmlbuilder = HTMLBuilder()
        val director = Director(htmlbuilder)
        director.construct()
        val filename = htmlbuilder.getResult()
        println(filename)
    } else {
        usage()
        System.exit(0)
    }

}
fun usage() {
    println("Usage:java Création de document brut principal avec du texte brut")
    println("Usage:Création de document html principal java avec fichier HTML")
}

résultat d'exécution clair


================================================
[Greeting]

■ Du matin à midi

·Bonjour.
·Bonjour.

■ La nuit

·Bonsoir.
·bonne nuit.
·Au revoir.

================================================

résultat de l'exécution html


Greeting.html a été créé.

Greeting.html


<html><head><title>Greeting</title></head><body>
<h1>Greeting</h1>
<p>Du matin à midi</p>
<ul>
<li>Bonjour.</li>
<li>Bonjour.</li>
</ul>
<p>La nuit</p>
<ul>
<li>Bonsoir.</li>
<li>bonne nuit.</li>
<li>Au revoir.</li>
</ul>
</body></html>

Diagramme de classe

image.png

Impressions

  1. Dans kotlin, String # equals est représenté par ==, et j'ai appris à exécuter equals en interne et à utiliser === si je veux comparer des références.
  2. J'ai appris que Until, qui ne compte pas le nombre de fractions, convient à l'utilisation d'une collection telle que Array dans une instruction for.
  3. J'ai également découvert le modèle de chaîne (interpolation de chaîne), l'évaluation des délais et java.io.File # printWriter ().

référence

C'était très facile à lire et à comprendre en se référant à ce qui suit.

Kotlin – Create File – Examples Développement Android avec Kotlin! Maintenons la syntaxe de base Ce que les programmeurs Java trouvent utile avec Kotlin [Délai d'initialisation avec Kotlin](https://re-engines.com/2018/11/15/Délai d'initialisation avec kotlin /) E / S (fichier, réseau, etc.) Kotlin - toString, equals, hashCode

Recommended Posts

J'ai écrit un modèle de conception dans l'édition Kotlin Builder
J'ai écrit un modèle de conception dans l'édition Kotlin Singleton
J'ai écrit un modèle de conception dans l'édition Kotlin Adapter
J'ai écrit un modèle de conception en kotlin, édité par Iterator
J'ai écrit un modèle de conception dans l'édition de modèle kotlin
J'ai écrit un modèle de conception dans l'édition Kotlin Prototype
Apprenez le modèle de conception "Builder" avec Python
Modèle de conception #Builder
Un mémo que j'ai écrit un tri rapide en Python
J'ai écrit une classe en Python3 et Java
J'ai écrit un analyseur japonais en japonais en utilisant pyparsing.
J'ai écrit python en japonais
J'ai écrit un script pour obtenir un site populaire au Japon
J'ai écrit un script qui divise l'image en deux
J'obtiens un UnicodeDecodeError avec mecab-python3
J'obtiens une KeyError dans pyclustering.xmeans
J'ai étudié les modèles de conception (mémo personnel) Partie 3 (modèle de prototype, modèle de constructeur)
J'ai écrit une fonction pour charger le script d'extension Git en Python
J'ai écrit Fizz Buzz en Python
J'ai écrit Gray Scale avec Pytorch
J'ai écrit un script pour extraire les liens de pages Web en Python
J'ai écrit la file d'attente en Python
J'ai participé à AtCoder (édition ABC169)
J'ai écrit la pile en Python
J'ai écrit un code pour convertir quaternion en angle de graissage de type z-y-x avec Python
[Python] J'ai écrit de force une courte fonction de génération de bruit parlin dans Numpy.
J'ai écrit FizzBuzz en python en utilisant la machine à vecteurs de support (bibliothèque LIVSVM).
Je veux imprimer dans la notation d'inclusion
Apprenez le modèle de conception "Flyweight" en Python
J'ai fait un programme de gestion de la paie en Python!
Apprenez le modèle de conception "Observer" en Python
Apprenez le modèle de conception "Memento" avec Python
Apprenez le modèle de conception "Proxy" en Python
Apprenez le modèle de conception "Visiteur" avec Python
Apprenez le modèle de conception "Bridge" avec Python
Apprenez le modèle de conception "Mediator" avec Python
Apprenez le modèle de conception "Décorateur" avec Python
Tri sélect écrit en C
Apprenez le modèle de conception "Iterator" avec Python
[Gang of Four] Apprentissage des modèles de conception - Constructeur
Apprenez le modèle de conception «Stratégie» avec Python
Apprenez le modèle de conception "Composite" avec Python
Apprenez le modèle de conception "État" en Python
J'ai écrit Project Euler 1 en une seule ligne.
Apprenez le modèle de conception "Adapter" avec Python
Démarrage de Node.js dans un environnement virtuel
J'ai créé un outil de mot de passe en Python.
J'ai écrit l'aile coulissante dans la création.
J'ai écrit un graphe comme R glmnet en Python pour une modélisation clairsemée avec Lasso
J'ai écrit un module PyPI qui étend le style de paramètre dans le module sqlite3 de Python
Quand j'obtiens une erreur de pilote chrome dans Selenium
Apprenez le modèle de conception "Abstract Factory" avec Python
Apprenez le modèle de conception "Méthode de modèle" en Python
Je veux créer une fenêtre avec Python
J'ai essayé de jouer à un jeu de frappe avec Python
Apprenez le modèle de conception "Méthode d'usine" en Python
J'ai écrit "Introduction à la vérification des effets" en Python
J'ai écrit un script pour télécharger un plug-in WordPress
J'ai essayé d'ajouter un module Python 3 en C