{"id":2056,"date":"2019-06-08T15:18:16","date_gmt":"2019-06-08T12:18:16","guid":{"rendered":"http:\/\/demensdeum.com\/blog\/?p=2056"},"modified":"2024-12-16T22:32:36","modified_gmt":"2024-12-16T19:32:36","slug":"template-pattern","status":"publish","type":"post","link":"https:\/\/demensdeum.com\/blog\/de\/2019\/06\/08\/template-pattern\/","title":{"rendered":"Vorlagenmethode"},"content":{"rendered":"<p>Die Mustermethode bezieht sich auf Verhaltensentwurfsmuster. Das Muster beschreibt eine M\u00f6glichkeit, einen Teil der Logik einer Klasse bei Bedarf zu ersetzen, wobei der Gesamtteil f\u00fcr Nachkommen unver\u00e4ndert bleibt.<\/p>\n<figure id=\"attachment_2059\" aria-describedby=\"caption-attachment-2059\" style=\"width: 420px\" class=\"wp-caption alignnone\"><a href=\"https:\/\/www.flickr.com\/photos\/diphi\/24449843465\/\" target=\"_blank\" rel=\"noopener noreferrer\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-2059\" src=\"https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2019\/06\/cars-1.jpg\" alt=\"\" width=\"420\" height=\"265\" \/><\/a><figcaption id=\"caption-attachment-2059\" class=\"wp-caption-text\"><a href=\"https:\/\/www.flickr.com\/photos\/diphi\/24449843465\/\" target=\"_blank\" rel=\"noopener noreferrer\">Cuban Cars<\/a><\/figcaption><\/figure>\n<p>Angenommen, wir entwickeln eine Kundenbank, denken Sie \u00fcber die Aufgabe nach, ein Autorisierungsmodul zu entwickeln &#8211; Der Benutzer muss sich mit abstrakten Anmeldedaten in die Anwendung einloggen k\u00f6nnen.<br \/>Das Autorisierungsmodul muss plattform\u00fcbergreifend sein, verschiedene Autorisierungstechnologien unterst\u00fctzen und verschl\u00fcsselte Daten verschiedener Plattformen speichern. Um das Modul zu implementieren, w\u00e4hlen wir die plattform\u00fcbergreifende Kotlin-Sprache. Mithilfe der abstrakten Klasse (Protokoll) des Autorisierungsmoduls schreiben wir eine Implementierung f\u00fcr das MyPhone-Telefon:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>class MyPhoneSuperDuperSecretMyPhoneAuthorizationStorage {\n    fun loginAndPassword() : Pair<String, String> {\n        return Pair(\"admin\", \"qwerty65435\")\n    }\n}\n\nclass ServerApiClient {\n    fun authorize(authorizationData: AuthorizationData) : Unit {\n        println(authorizationData.login)\n        println(authorizationData.password)\n        println(\"Authorized\")\n    }\n}\n\nclass AuthorizationData {\n    var login: String? = null\n    var password: String? = null\n}\n\ninterface AuthorizationModule {\n    abstract fun fetchAuthorizationData() : AuthorizationData\n    abstract fun authorize(authorizationData: AuthorizationData)\n}\n\nclass MyPhoneAuthorizationModule: AuthorizationModule {\n    \n    override fun fetchAuthorizationData() : AuthorizationData {\n        val loginAndPassword = MyPhoneSuperDuperSecretMyPhoneAuthorizationStorage().loginAndPassword()\n        val authorizationData = AuthorizationData()\n        authorizationData.login = loginAndPassword.first\n        authorizationData.password = loginAndPassword.second\n        \n        return authorizationData\n    }\n    \n    override fun authorize(authorizationData: AuthorizationData) {\n        ServerApiClient().authorize(authorizationData)\n    }\n    \n}\n\nfun main() {\n    val authorizationModule = MyPhoneAuthorizationModule()\n    val authorizationData = authorizationModule.fetchAuthorizationData()\n    authorizationModule.authorize(authorizationData)\n}\n<\/code><\/pre>\n<\/div>\n<p>Jetzt m\u00fcssen wir f\u00fcr jedes Telefon\/jede Plattform den Code zum Senden der Autorisierung an den Server duplizieren. Dies stellt einen Versto\u00df gegen das DRY-Prinzip dar. Das obige Beispiel ist sehr einfach, in komplexeren Klassen wird es noch mehr Duplikate geben. Um Codeduplizierungen zu vermeiden, sollten Sie das Template-Methodenmuster verwenden.<br \/>Lassen Sie uns die gemeinsamen Teile des Moduls in unver\u00e4nderliche Methoden verschieben und die Funktionalit\u00e4t der verschl\u00fcsselten Daten\u00fcbertragung auf bestimmte Plattformklassen \u00fcbertragen:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>class MyPhoneSuperDuperSecretMyPhoneAuthorizationStorage {\n    fun loginAndPassword() : Pair<String, String> {\n        return Pair(\"admin\", \"qwerty65435\")\n    }\n}\n\nclass ServerApiClient {\n    fun authorize(authorizationData: AuthorizationData) : Unit {\n        println(authorizationData.login)\n        println(authorizationData.password)\n        println(\"Authorized\")\n    }\n}\n\nclass AuthorizationData {\n    var login: String? = null\n    var password: String? = null\n}\n\ninterface AuthorizationModule {\n    abstract fun fetchAuthorizationData() : AuthorizationData\n    \n    fun authorize(authorizationData: AuthorizationData) {\n        ServerApiClient().authorize(authorizationData)\n    }\n}\n\nclass MyPhoneAuthorizationModule: AuthorizationModule {\n    \n    override fun fetchAuthorizationData() : AuthorizationData {\n        val loginAndPassword = MyPhoneSuperDuperSecretMyPhoneAuthorizationStorage().loginAndPassword()\n        val authorizationData = AuthorizationData()\n        authorizationData.login = loginAndPassword.first\n        authorizationData.password = loginAndPassword.second\n        \n        return authorizationData\n    }\n    \n}\n\nfun main() {\n    val authorizationModule = MyPhoneAuthorizationModule()\n    val authorizationData = authorizationModule.fetchAuthorizationData()\n    authorizationModule.authorize(authorizationData)\n}\n<\/code><\/pre>\n<\/div>\n<h3>Quellen<\/h3>\n<p><a href=\"https:\/\/refactoring.guru\/ru\/design-patterns\/template-method\" rel=\"noopener noreferrer\" target=\"_blank\">https:\/\/refactoring.guru\/ru\/design- Muster\/Vorlagenmethode<\/a><\/p>\n<h3>Quellcode<\/h3>\n<p><a href=\"https:\/\/gitlab.com\/demensdeum\/patterns\/\" rel=\"noopener noreferrer\" target=\"_blank\">https:\/\/gitlab.com\/demensdeum\/patterns\/<\/a>< \/p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die Mustermethode bezieht sich auf Verhaltensentwurfsmuster. Das Muster beschreibt eine M\u00f6glichkeit, einen Teil der Logik einer Klasse bei Bedarf zu ersetzen, wobei der Gesamtteil f\u00fcr Nachkommen unver\u00e4ndert bleibt. Cuban Cars Angenommen, wir entwickeln eine Kundenbank, denken Sie \u00fcber die Aufgabe nach, ein Autorisierungsmodul zu entwickeln &#8211; Der Benutzer muss sich mit abstrakten Anmeldedaten in die<a class=\"more-link\" href=\"https:\/\/demensdeum.com\/blog\/de\/2019\/06\/08\/template-pattern\/\">Continue reading <span class=\"screen-reader-text\">&#8220;Vorlagenmethode&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[61,52],"tags":[95,107],"class_list":["post-2056","post","type-post","status-publish","format-standard","hentry","category-techie","category-tutorials","tag-patterns","tag-template-method","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"de","enabled_languages":["en","ru","zh","de","fr","ja","pt","hi"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"ru":{"title":true,"content":true,"excerpt":false},"zh":{"title":true,"content":true,"excerpt":false},"de":{"title":true,"content":true,"excerpt":false},"fr":{"title":true,"content":true,"excerpt":false},"ja":{"title":true,"content":true,"excerpt":false},"pt":{"title":true,"content":true,"excerpt":false},"hi":{"title":false,"content":false,"excerpt":false}}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/posts\/2056","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/comments?post=2056"}],"version-history":[{"count":13,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/posts\/2056\/revisions"}],"predecessor-version":[{"id":3954,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/posts\/2056\/revisions\/3954"}],"wp:attachment":[{"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/media?parent=2056"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/categories?post=2056"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/tags?post=2056"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}