Zuständigkeitskette

Die Zuständigkeitskette (englisch chain of responsibility) ist ein in der Softwareentwicklung eingesetztes Entwurfsmuster. Es gehört zur Kategorie der Verhaltensmuster (englisch behavioral design patterns) und wird für Algorithmen verwendet. Dabei dient es der Entkopplung des Auslösers einer Anfrage mit seinem Empfänger.[1] Das Muster ist eines der sogenannten GoF-Muster (siehe Viererbande, Gang of Four).

Verwendung

Mehrere Objekte werden hintereinander geschaltet (miteinander verkettet), um gemeinsam eine eingehende Anfrage bearbeiten zu können. Diese Anfrage wird an der Kette entlang geleitet, bis eines der Objekte die Anfrage beantworten kann. Der Klient, von dem die Anfrage ausgeht, hat dabei keine Kenntnis darüber, von welchem Objekt die Anfrage beantwortet werden wird.

UML-Diagramm

Zuständigkeitskette in UML-Notation
Zuständigkeitskette in UML-Notation

Akteure

Bei einer Zuständigkeitskette spielen drei Akteure eine Rolle:

  • Bearbeiter, der ein Interface für die Anfragen definiert
  • konkreter Bearbeiter, der alle Anfragen bearbeitet, für die er selbst zuständig ist und alle anderen Anfragen an das nächste Kettenglied (den nächsten Bearbeiter) weiterleitet
  • Klient, der die Anfrage an irgendeinem konkreten Bearbeiter initiiert.

Vor- und Nachteile

Ein Vorteil ist, dass der Klient den tatsächlich zuständigen Bearbeiter nicht kennen muss. Selbst die Kettenglieder müssen nur ihren direkten Nachfolger und nicht den Gesamt-Aufbau der Kette kennen. Dies führt zu einer geringeren Kopplung. Außerdem kann die Zuständigkeit von Objekten für bestimmte Anfragen verändert werden, ohne dass potenzielle Klienten davon in Kenntnis gesetzt werden müssen.

Es gibt auf der anderen Seite keine Garantie, dass die Anfrage tatsächlich bearbeitet wird. Wenn das letzte Glied der Kette eine Anfrage erhält, für die es ebenfalls nicht zuständig ist, wird die Anfrage nach obigem Muster verworfen. Dies muss durch eine entsprechende Fallbehandlung abgefangen werden.

Es muss sichergestellt werden, dass jeder Bearbeiter in der Kette nur einmal vorkommt, sonst entstehen Kreise und das Programm bleibt in einer Endlosschleife hängen.

Beispiel

Diese C++11 Implementierung basiert auf der vor C++98 Implementierung im Buch Entwurfsmuster.

#include <iostream>
#include <memory>

typedef int Thema;
constexpr Thema KEIN_HILFE_THEMA = -1;

// definiert eine Schnittstelle zur Bearbeitung von Anfragen.
class HilfeBearbeiter { // Bearbeiter
public:
  HilfeBearbeiter(HilfeBearbeiter* h = nullptr, Thema t = KEIN_HILFE_THEMA)
    : nachfolger(h), thema(t) {}
  virtual bool hatHilfe() {
    return thema != KEIN_HILFE_THEMA;
  }
  virtual void setBearbeiter(HilfeBearbeiter*, Thema) {}
  virtual void bearbeiteHilfe() {
    std::cout << "HilfeBearbeiter::bearbeiteHilfe\n";
    // (optional) implementiert eine Verbindung zum Nachfolgeobjekt.
    if (nachfolger != nullptr) {
      nachfolger->bearbeiteHilfe();
    }
  }
  virtual ~HilfeBearbeiter() = default;
  HilfeBearbeiter(const HilfeBearbeiter&) = delete; // Dreierregel
  HilfeBearbeiter& operator=(const HilfeBearbeiter&) = delete;
private:
  HilfeBearbeiter* nachfolger;
  Thema thema;
};

class Widget : public HilfeBearbeiter {
public:
  Widget(const Widget&) = delete; // Dreierregel
  Widget& operator=(const Widget&) = delete;
protected:
  Widget(Widget* w, Thema t = KEIN_HILFE_THEMA) 
    : HilfeBearbeiter(w, t), elternObjekt(nullptr) {
    elternObjekt = w;
  }
private:
  Widget* elternObjekt;
};

class Button : public Widget { // KonkreterBearbeiter
public:
  Button(std::shared_ptr<Widget> h, Thema t = KEIN_HILFE_THEMA) : Widget(h.get(), t) {}
  virtual void bearbeiteHilfe() {
    // wenn der KonkreteBearbeiter die Anfrage bearbeiten kann, tut er es auch; andernfalls leitet er die Anfrage an das Nachfolgeobjekt weiter.
    std::cout << "Button::bearbeiteHilfe\n";
    if (hatHilfe()) {
      // arbeitet genau die Anfrage ab, für die er zuständig ist.
    } else {      
      // kann auf seinen Nachfolger zugreifen.
      HilfeBearbeiter::bearbeiteHilfe();
    }
  }
};

class Dialog : public Widget { // KonkreterBearbeiter
public:
  Dialog(std::shared_ptr<HilfeBearbeiter> h, Thema t = KEIN_HILFE_THEMA) : Widget(nullptr) {
    setBearbeiter(h.get(), t);
  }
  virtual void bearbeiteHilfe() {
    std::cout << "Dialog::bearbeiteHilfe\n";
    if(hatHilfe()) {
      // biete Hilfsinformationen für den Dialog an
    } else {
      HilfeBearbeiter::bearbeiteHilfe();
    }
  }
};

class Anwendung : public HilfeBearbeiter {
public:
  Anwendung(Thema t) : HilfeBearbeiter(nullptr, t) {}
  virtual void bearbeiteHilfe() {
    std::cout << "Anwendung::bearbeiteHilfe\n";
    // zeige eine Liste von Hilfsthemen an
  }
};

int main() {
  constexpr Thema DRUCKE_THEMA = 1;
  constexpr Thema PAPIER_ORIENTIERUNG_THEMA = 2;
  constexpr Thema ANWENDUNG_THEMA = 3;
  // Die Smart pointers verhindern Memory leaks.
  std::shared_ptr<Anwendung> application = std::make_shared<Anwendung>(ANWENDUNG_THEMA);
  std::shared_ptr<Dialog> dialog = std::make_shared<Dialog>(application, DRUCKE_THEMA);
  std::shared_ptr<Button> button = std::make_shared<Button>(dialog, PAPIER_ORIENTIERUNG_THEMA);

  button->bearbeiteHilfe();
}

Die Programmausgabe ist:

Button::bearbeiteHilfe

Verwandte Entwurfsmuster

Ein verwandtes Entwurfsmuster ist der Decorator: Vor oder nachdem eine Anfrage weitergeleitet wird, können zusätzliche Operationen erfolgen, wie zum Beispiel Gültigkeitsprüfungen. Außerdem ähnlich ist das Kompositum. Dabei wird die Anfrage so lange vom Child zum Parent weitergereicht, bis sie beantwortet wird oder kein weiteres Objekt folgt. Eine weitere Möglichkeit ergibt sich durch einen Iterator über Objekte mit Schablonenmethoden.

Einzelnachweise

  1. Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides: Entwurfsmuster. 5. Auflage. Addison-Wesley, 1996, ISBN 3-8273-1862-9, S. 410.


Read other articles:

Liga Angkatan Laut atau Asosiasi Armada (Jerman: Deutscher Flottenvereincode: de is deprecated ) di Kekaisaran Jerman adalah kelompok kepentingan yang dibentuk pada tanggal 30 April 1898 atas prakarsa Laksamana Alfred von Tirpitz melalui Kantor Angkatan Laut Kekaisaran Jerman (Reichsmarineamt) yang dipimpinnya (1897–1916) untuk mendukung perluasan Angkatan Laut Kekaisaran Jerman (Kaiserliche Marine) . Secara khusus itu dimaksudkan untuk mengembangkan tekanan populer di parlemen Jerman (Reic...

 

Hale Passage and Wollochet Bay Navigation CompanyThe steamer Crest later renamed Bay Island.Founded1912 The Hale Passage and Wollochet Bay Navigation Company was a cooperative formed in 1912 by a group of 120 farmers for the purpose of pooling their resources to save shipping costs by purchasing a steamboat to ship their produce to market. The cooperative also intended to change the steamer's schedule to better fit the farmer's needs. In May 1912, the company bought the propeller steamer Cres...

 

Teks berbahasa Sanskerta Sūtra Hati (Inggris: Heart Sūtra, dalam naskah Siddhaṃ. Replika dari manuskrip daun palem tertanggal 609 M. Teks berbahasa Tionghoa Sūtra Hati, oleh pelajar dan kaligrafer Ouyang Xun, tahun 635 M. Teks berbahasa Tionghoa Sūtra Hati, oleh seniman dan kaligrafer Dinasti Yuan Zhao Mengfu (1254–1322 EU). Bagian dari serialAgama Buddha Zen Lima Kelompok Caodong / SōtōLinji / RinzaiFayan / HōgenGuiyang / IgyōYunmen / Unmon Tata cara Meditasi dudukSamādhiPen...

For the Taiwanese school, see National Taiwan Normal University. Letterhead (1896) for The National Normal University National Normal University was a teacher's college in Lebanon, Ohio. Located in southwestern Ohio, it opened in 1855 as Southwestern Normal School and took the name National Normal University in 1870. Alfred Holbrook was the first president and the school's guiding force for most of its existence. He resigned in 1897 after 42 years. In 1907 the NNU became public and changed it...

 

يفتقر محتوى هذه المقالة إلى الاستشهاد بمصادر. فضلاً، ساهم في تطوير هذه المقالة من خلال إضافة مصادر موثوق بها. أي معلومات غير موثقة يمكن التشكيك بها وإزالتها. (نوفمبر 2019) كأس إسكتلندا 1990–91 تفاصيل الموسم كأس إسكتلندا  البلد المملكة المتحدة  التاريخ بداية:1990  البطل ناد...

 

Median king DeiocesKing of the MedesDeioces commands the Medes to set forth on their course of conquest. After a painting by Louis Boulanger (1806-1867).[1]King of the MedesReign700-678 BC[2]PredecessorKingdom establishedSuccessorPhraortesDied678 BCDynastyMedian dynastyFatherPhraortes, the OldReligionAncient Iranian religion Deioces (Ancient Greek: Δηιόκης, Dēiokēs, Kurdish: Diyako),[3] was the founder and first king of the Median kingdom. His name has been me...

Irish racing cyclist For other people with the same name, see Sam Bennett (disambiguation). Sam BennettBennett in 2019.Personal informationFull nameSam BennettNickname'Sammy B'Born (1990-10-16) 16 October 1990 (age 33)Wervik, Flanders, BelgiumHeight1.78 m (5 ft 10 in)[1]Weight73 kg (161 lb; 11 st 7 lb)[1]Team informationCurrent teamDecathlon–AG2R La MondialeDisciplineRoadRoleRiderRider typeSprinterAmateur teams2007–201...

 

Lanskap Paroy. ParoyNegaraPrancisArondisemenProvinsKantonDonnemarie-DontillyAntarkomuneCommunauté de communes du MontoisPemerintahan • Wali kota (2008-2014) Jean-Claude Gautry • Populasi1193Kode INSEE/pos77355 / 2 Population sans doubles comptes: penghitungan tunggal penduduk di komune lain (e.g. mahasiswa dan personil militer). Paroy merupakan sebuah komune di departemen Seine-et-Marne di region Île-de-France di utara-tengah Prancis. Demografi Pada sensus 1999,...

 

Ираклеониты — ученики гностика Ираклеона (II век). Упоминаются как особая секта Епифанием и Августином; при крещении и миропомазании они соблюдали обряд помазания елеем и при этом произносили воззвания на арамейском языке, которые должны были освободить душу от власт�...

The Ranger Creed is the official creed of the United States Army Rangers. The Ranger Creed was written in 1974 by CSM Neal R. Gentry, the original command sergeant major of the reactivated 1st Ranger Battalion. It was initiated by the Battalion Commander, then-LTC Kenneth C. Leuer, and re-drafted by the battalion XO, MAJ Rock Hudson and finalized at Fort Stewart, Georgia in 1974 when the original cadre deployed there on 1 July 1974. Today, members of Ranger community recite the Ranger Creed ...

 

Moncetz-LongevascomuneMoncetz-Longevas – Veduta LocalizzazioneStato Francia RegioneGrand Est Dipartimento Marna ArrondissementChâlons-en-Champagne CantoneChâlons-en-Champagne-3 TerritorioCoordinate48°55′N 4°26′E / 48.916667°N 4.433333°E48.916667; 4.433333 (Moncetz-Longevas)Coordinate: 48°55′N 4°26′E / 48.916667°N 4.433333°E48.916667; 4.433333 (Moncetz-Longevas) Superficie7,26 km² Abitanti571[1] (2009) Densità78,6...

 

San Salvatore Monferratocomune San Salvatore Monferrato – VedutaVeduta di San Salvatore e della torre dei Paleologo LocalizzazioneStato Italia Regione Piemonte Provincia Alessandria AmministrazioneSindacoCorrado Tagliabue (lista civica) dal 3-10-2021 TerritorioCoordinate44°59′42″N 8°34′01″E / 44.995°N 8.566944°E44.995; 8.566944 (San Salvatore Monferrato)Coordinate: 44°59′42″N 8°34′01″E / 44.995°N 8.566944°E4...

この項目には、一部のコンピュータや閲覧ソフトで表示できない文字が含まれています(詳細)。 数字の大字(だいじ)は、漢数字の一種。通常用いる単純な字形の漢数字(小字)の代わりに同じ音の別の漢字を用いるものである。 概要 壱万円日本銀行券(「壱」が大字) 弐千円日本銀行券(「弐」が大字) 漢数字には「一」「二」「三」と続く小字と、「壱」「�...

 

Державний комітет телебачення і радіомовлення України (Держкомтелерадіо) Приміщення комітетуЗагальна інформаціяКраїна  УкраїнаДата створення 2003Керівне відомство Кабінет Міністрів УкраїниРічний бюджет 1 964 898 500 ₴[1]Голова Олег НаливайкоПідвідомчі ор...

 

土库曼斯坦总统土库曼斯坦国徽土库曼斯坦总统旗現任谢尔达尔·别尔德穆哈梅多夫自2022年3月19日官邸阿什哈巴德总统府(Oguzkhan Presidential Palace)機關所在地阿什哈巴德任命者直接选举任期7年,可连选连任首任萨帕尔穆拉特·尼亚佐夫设立1991年10月27日 土库曼斯坦土库曼斯坦政府与政治 国家政府 土库曼斯坦宪法 国旗 国徽 国歌 立法機關(英语:National Council of Turkmenistan) ...

PT Boat Museum at Battleship Cove PT Boat Museum is located in Fall River, Massachusetts as part of Battleship Cove. It is a museum that exhibits two National Historic Landmark ships, an 80-foot (24.4 m) Elco boat, PT 617, and a 78-foot (23.8 m) Higgins boat, PT 796. External links PT Boat Museum, official site 41°42′18.1″N 71°9′47.1″W / 41.705028°N 71.163083°W / 41.705028; -71.163083 This article about a National Register of Historic Places listi...

 

German Holocaust denier (1939–2017) Zündel redirects here. For other people named Zündel, see Zündel (name). Ernst ZündelZündel in 1992BornErnst Christof Friedrich Zündel(1939-04-24)24 April 1939Calmbach, Württemberg, Nazi GermanyDied5 August 2017(2017-08-05) (aged 78)[1]Bad Wildbad, Baden-Württemberg, GermanyKnown forNeo-NazismHolocaust denialPolitical partyRalliement créditiste (before 1968)Liberal (1968)Social Credit (1983-1987)Spouse(s)Janick Larouche(m. 1959...

 

This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: Tomakomai – news · newspapers · books · scholar · JSTOR (January 2014) (Learn how and when to remove this message) City in Hokkaido, JapanTomakomai 苫小牧市City FlagSealLocation of Tomakomai in Hokkaido (Iburi Subprefecture)TomakomaiLocation in JapanCoordin...

Music of Cuba General topics Related articles Genres Afro Afro-Cuban jazz Bakosó Bolero (filin) Canción Chachachá Charanga Conga Contradanza (habanera) Criolla Cubatón Danzón Descarga Guajira Guaracha Hip hop Mambo Mozambique Nueva trova Pachanga Pilón Pregón Punto guajiro Rock Rumba (guaguancó, columbia, yambú, batá-rumba, guarapachangueo) Son (montuno) Songo Timba Trova Specific forms Religious music Abakuá Arará Iyesá Makuta Palo Santería Yuka Traditional music Changüí Cor...

 

Edward Bliss Foote designed an early form of barrier contraception that he called the womb veil The womb veil was a 19th-century American form of barrier contraception consisting of an occlusive pessary, i.e. a device inserted into the vagina to block access of the sperm into the uterus. Made of rubber, it was a forerunner to the modern diaphragm and cervical cap.[1] The name was first used by Edward Bliss Foote in 1863 for the device he designed and marketed.[2] Womb veil bec...