{"id":2022,"date":"2019-05-30T09:00:37","date_gmt":"2019-05-30T06:00:37","guid":{"rendered":"http:\/\/demensdeum.com\/blog\/?p=2022"},"modified":"2024-12-16T22:32:37","modified_gmt":"2024-12-16T19:32:37","slug":"chain-of-responsibility-pattern","status":"publish","type":"post","link":"https:\/\/demensdeum.com\/blog\/de\/2019\/05\/30\/chain-of-responsibility-pattern\/","title":{"rendered":"Muster der Verantwortungskette"},"content":{"rendered":"<p>Verantwortungskette bezieht sich auf Verhaltensmuster.<\/p>\n<p><a href=\"https:\/\/www.flickr.com\/photos\/122565603@N02\/13689239584\/\" target=\"_blank\" rel=\"noopener\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2025\" src=\"https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2019\/05\/13689239584_12c1c20ebc_z1.jpg\" alt=\"\" width=\"427\" height=\"640\" \/><\/a><br \/>\n<a class=\"owner-name truncate no-outline\" title=\"Gehe zu Ganna Dolbievas Fotostream\" href=\"https:\/\/www.flickr.com\/photos\/122565603@N02\/\" target=\"_blank\" rel=\" noopener\" data-track=\"attributionNameClick\">Ganna Dolbieva<\/a><\/p>\n<p>Die Filmfirma Jah-Pictures drehte einen Dokumentarfilm \u00fcber kommunistische Rastafarians aus Liberia mit dem Titel \u201eRed Dawn of Marley\u201c. Der Film ist sehr lang (8 Stunden) und interessant, aber vor seiner Ver\u00f6ffentlichung stellte sich heraus, dass in einigen L\u00e4ndern Szenen und Phrasen aus dem Film als Ketzerei gelten und keine Vertriebslizenz erhalten. Die Produzenten des Films beschlie\u00dfen, manuell und automatisch Momente mit fragw\u00fcrdigen Phrasen aus dem Film herauszuschneiden. Eine doppelte Kontrolle ist erforderlich, damit die Vertreter des H\u00e4ndlers in einigen L\u00e4ndern nicht einfach erschossen werden, falls bei der manuellen Inspektion und Installation ein Fehler auftritt.<br \/>Die L\u00e4nder werden in vier Gruppen eingeteilt &#8211; L\u00e4nder ohne Zensur, mit m\u00e4\u00dfiger, mittlerer und sehr strenger Zensur. Es wird beschlossen, neuronale Netze zu verwenden, um den Grad der H\u00e4resie im angesehenen Filmausschnitt zu klassifizieren. F\u00fcr das Projekt werden sehr teure hochmoderne Neuronen angeschafft, auf unterschiedliche Zensurstufen trainiert, die Aufgabe des Entwicklers &#8211; Brechen Sie den Film in Fragmente auf und \u00fcbertragen Sie sie durch eine Kette neuronaler Netze, von frei bis streng, bis eines von ihnen H\u00e4resie erkennt. Anschlie\u00dfend wird das Fragment zur manuellen \u00dcberpr\u00fcfung zur weiteren Bearbeitung \u00fcbertragen. Es ist unm\u00f6glich, alle Neuronen zu durchlaufen, weil Ihre Arbeit erfordert zu viel Rechenleistung (schlie\u00dflich m\u00fcssen wir immer noch f\u00fcr Strom bezahlen), es reicht aus, bei der ersten anzuhalten, die funktioniert.<br \/>Naive Pseudocode-Implementierung:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>import StateOfArtCensorshipHLNNClassifiers\n\nprotocol MovieCensorshipClassifier {\n    func shouldBeCensored(movieChunk: MovieChunk) -&gt; Bool\n}\n\nclass CensorshipClassifier: MovieCensorshipClassifier {\n\n    let hnnclassifier: StateOfArtCensorshipHLNNClassifier\n\n    init(_ hnnclassifier: StateOfArtCensorshipHLNNClassifier) {\n        self.hnnclassifier = hnnclassifier\n    }\n    \n    func shouldBeCensored(_ movieChunk: MovieChunk) -&gt; Bool {\n        return hnnclassifier.shouldBeCensored(movieChunk)\n    }\n}\n\nlet lightCensorshipClassifier = CensorshipClassifier(StateOfArtCensorshipHLNNClassifier(\"light\"))\nlet normalCensorshipClassifier = CensorshipClassifier(StateOfArtCensorshipHLNNClassifier(\"normal\"))\nlet hardCensorshipClassifier = CensorshipClassifier(StateOfArtCensorshipHLNNClassifier(\"hard\"))\n\nlet classifiers = [lightCensorshipClassifier, normalCensorshipClassifier, hardCensorshipClassifier]\n\nlet movie = Movie(\"Red Jah rising\")\nfor chunk in movie.chunks {\n    for classifier in classifiers {\n        if classifier.shouldBeCensored(chunk) == true {\n            print(\"Should censor movie chunk: \\(chunk), reported by \\(classifier)\")\n        }\n   }\n}\n<\/code><\/pre>\n<\/div>\n<p>Im Allgemeinen ist die L\u00f6sung mit einem Array von Klassifikatoren jedoch nicht so schlecht! Stellen wir uns vor, dass wir kein Array erstellen k\u00f6nnen, wir haben die M\u00f6glichkeit, nur eine Klassifikatoreinheit zu erstellen, die bereits die Art der Zensur f\u00fcr ein Filmfragment bestimmt. Solche Einschr\u00e4nkungen sind m\u00f6glich, wenn eine Bibliothek entwickelt wird, die die Funktionalit\u00e4t der Anwendung (Plugin) erweitert.<br \/>Verwenden wir das Dekoratormuster &#8211; F\u00fcgen wir der Klassifikatorklasse einen Verweis auf den n\u00e4chsten Klassifikator in der Kette hinzu und stoppen den \u00dcberpr\u00fcfungsprozess bei der ersten erfolgreichen Klassifizierung.<br \/>Daher implementieren wir das Chain of Responsibility-Muster:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>import StateOfArtCensorshipHLNNClassifiers\n\nprotocol MovieCensorshipClassifier {\n    func shouldBeCensored(movieChunk: MovieChunk) -&gt; Bool\n}\n\nclass CensorshipClassifier: MovieCensorshipClassifier {\n\n    let nextClassifier: CensorshipClassifier?\n    let hnnclassifier: StateOfArtCensorshipHLNNClassifier\n\n    init(_ hnnclassifier: StateOfArtCensorshipHLNNClassifier, nextClassifier: CensorshipClassifiers?) {\n            self.nextClassifier = nextClassifier\n            self.hnnclassifier = hnnclassifier\n    }\n    \n    func shouldBeCensored(_ movieChunk: MovieChunk) -&gt; Bool {\n        let result = hnnclassifier.shouldBeCensored(movieChunk)\n        \n        print(\"Should censor movie chunk: \\(movieChunk), reported by \\(self)\")\n        \n        if result == true {\n                return true\n        }\n        else {\n                return nextClassifier?.shouldBeCensored(movieChunk) ?? false\n        }\n    }\n}\n\nlet censorshipClassifier = CensorshipClassifier(StateOfArtCensorshipHLNNClassifier(\"light\"), nextClassifier: CensorshipClassifier(StateOfArtCensorshipHLNNClassifier(\"normal\", nextClassifier: CensorshipClassifier(StateOfArtCensorshipHLNNClassifier(\"hard\")))))\n\nlet movie = Movie(\"Red Jah rising\")\nfor chunk in movie.chunks {\n    censorshipClassifier.shouldBeCensored(chunk)\n}\n<\/code><\/pre>\n<\/div>\n<h3>Referenzen<\/h3>\n<p><a href=\"https:\/\/refactoring.guru\/ru\/design-patterns\/chain-of-responsibility\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/refactoring.guru\/ru\/ Designmuster\/Verantwortungskette<\/a><\/p>\n<h3>Quellcode<\/h3>\n<p><a href=\"https:\/\/gitlab.com\/demensdeum\/patterns\/\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/gitlab.com\/demensdeum\/patterns\/<\/a>< \/p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Verantwortungskette bezieht sich auf Verhaltensmuster. Ganna Dolbieva Die Filmfirma Jah-Pictures drehte einen Dokumentarfilm \u00fcber kommunistische Rastafarians aus Liberia mit dem Titel \u201eRed Dawn of Marley\u201c. Der Film ist sehr lang (8 Stunden) und interessant, aber vor seiner Ver\u00f6ffentlichung stellte sich heraus, dass in einigen L\u00e4ndern Szenen und Phrasen aus dem Film als Ketzerei gelten und<a class=\"more-link\" href=\"https:\/\/demensdeum.com\/blog\/de\/2019\/05\/30\/chain-of-responsibility-pattern\/\">Continue reading <span class=\"screen-reader-text\">&#8220;Muster der Verantwortungskette&#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":[105,95],"class_list":["post-2022","post","type-post","status-publish","format-standard","hentry","category-techie","category-tutorials","tag-chain-of-responsibility","tag-patterns","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\/2022","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=2022"}],"version-history":[{"count":18,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/posts\/2022\/revisions"}],"predecessor-version":[{"id":3956,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/posts\/2022\/revisions\/3956"}],"wp:attachment":[{"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/media?parent=2022"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/categories?post=2022"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/tags?post=2022"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}