From 765a22f0da47eae14275e5241e743cf96f174c9d Mon Sep 17 00:00:00 2001 From: Marcellii Date: Mon, 22 Jan 2018 19:10:01 +0100 Subject: [PATCH 01/41] Create Iterator Pattern --- Iterator Pattern | 1 + 1 file changed, 1 insertion(+) create mode 100644 Iterator Pattern diff --git a/Iterator Pattern b/Iterator Pattern new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/Iterator Pattern @@ -0,0 +1 @@ + From 50fd69691427876ba19bec742d52e08549d53f2a Mon Sep 17 00:00:00 2001 From: Tim 'bastelfreak' Meusel Date: Mon, 22 Jan 2018 19:23:07 +0100 Subject: [PATCH 02/41] add decorator.md --- decorator.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 decorator.md diff --git a/decorator.md b/decorator.md new file mode 100644 index 0000000..c80110b --- /dev/null +++ b/decorator.md @@ -0,0 +1 @@ +# Decorator Pattern From 03a0de5a62dd5282202fa0fdb52cc0579a9280b5 Mon Sep 17 00:00:00 2001 From: Tim 'bastelfreak' Meusel Date: Mon, 22 Jan 2018 20:00:44 +0100 Subject: [PATCH 03/41] add description for decorator pattern --- decorator.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/decorator.md b/decorator.md index c80110b..fe9b477 100644 --- a/decorator.md +++ b/decorator.md @@ -1 +1,11 @@ # Decorator Pattern + +## Beschreibung +Beim Decorator Pattern kann beliebige Funktionalität zu Objekten hinzugefügt +werden. Es gibt Basisklassen (Components/Komponenten). Diese werden mit +Decorators/Dekorierer erweitert. Decorator und Component sind vom gleichen Typ +(abstrakte Basisklasse oder Interface). Dekorator ruft immer die unterliegende +Implementierung einer Methode auf, und davor oder danach seine eigene. +Dekorators können beliebig verschachtelt werden. + +## Beispiel From f043fee7f00c8ff08e78a4ab17df9836acaf316a Mon Sep 17 00:00:00 2001 From: Marcellii Date: Mon, 22 Jan 2018 20:06:16 +0100 Subject: [PATCH 04/41] Update Iterator Pattern add some more text --- Iterator Pattern | 59 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/Iterator Pattern b/Iterator Pattern index 8b13789..cb71025 100644 --- a/Iterator Pattern +++ b/Iterator Pattern @@ -1 +1,60 @@ +# Iterator Pattern +Iteratoren werden in der C# Entwicklung als Liste oder Arrays verwendet und beispielsweise als Interface `IEnumerable` +in dem Programmcode hinterlegt werden. Iteratoren, müssen nicht zwangsweise eine zusätzliche Klasse besitzen, sondern können +ebenfalls direkt aufgerufen werden, siehe unten im Beispiel. Sie geben hier entsprechend mit der `Yield Return` +Methode nacheinander die Werte zurück, welche definiert werden müssen.Ein Iterator wird in der Regel mit +einer `foreach` Anweisung erzeugt. + +###Direkter Aufruf ohne IEnumerable Klasse +``` +static void Main() +{ + foreach (int number in SomeNumbers()) + { + Console.Write(number.ToString() + " "); + } + // Output: 3 5 8 + Console.ReadKey(); +} + +public static System.Collections.IEnumerable SomeNumbers() +{ + yield return 3; + yield return 5; + yield return 8; +} + +```` + +###Beispielcode /Hinterlegung einer IEnumerable Klasse mit Aufruf der Methode: +``` +###Aufruf der Methode im Code +static void Main() +{ + DaysOfTheWeek days = new DaysOfTheWeek(); + + foreach (string day in days) + { + Console.Write(day + " "); + } + // Output: Sun Mon Tue Wed Thu Fri Sat + Console.ReadKey(); +} + + +###Initialisierung der Klasse/Instanz +public class DaysOfTheWeek : IEnumerable +{ + private string[] days = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; + + public IEnumerator GetEnumerator() + { + for (int index = 0; index < days.Length; index++) + { + // Yield each day of the week. Aus + yield return days[index]; + } + } +} +``` From 3b09f6a20976c7cb386721f62043775339081e56 Mon Sep 17 00:00:00 2001 From: Marcellii Date: Mon, 22 Jan 2018 20:06:45 +0100 Subject: [PATCH 05/41] Rename Iterator Pattern to Iterator Pattern.md --- Iterator Pattern => Iterator Pattern.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Iterator Pattern => Iterator Pattern.md (100%) diff --git a/Iterator Pattern b/Iterator Pattern.md similarity index 100% rename from Iterator Pattern rename to Iterator Pattern.md From 593a2198b316a7782ee692592e7a2064c2607821 Mon Sep 17 00:00:00 2001 From: Tim 'bastelfreak' Meusel Date: Mon, 22 Jan 2018 20:07:23 +0100 Subject: [PATCH 06/41] add positive/negative list for decorator --- decorator.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/decorator.md b/decorator.md index fe9b477..e977986 100644 --- a/decorator.md +++ b/decorator.md @@ -1,6 +1,7 @@ # Decorator Pattern ## Beschreibung + Beim Decorator Pattern kann beliebige Funktionalität zu Objekten hinzugefügt werden. Es gibt Basisklassen (Components/Komponenten). Diese werden mit Decorators/Dekorierer erweitert. Decorator und Component sind vom gleichen Typ @@ -8,4 +9,16 @@ Decorators/Dekorierer erweitert. Decorator und Component sind vom gleichen Typ Implementierung einer Methode auf, und davor oder danach seine eigene. Dekorators können beliebig verschachtelt werden. +## Vorteile + +* Manipulation von Klassen kann zur Laufzeit und während dem Kompilieren +erfolgen +* Beliebige (Mehrfach)Kombination von Decorators ist möglich +* Das Interfaces, welches Clients nutzen, bleibt unverändert +* Klassen sind sehr kurz und übersichtlich, Sie implementieren nur das nötigste + +## Nachteile + +* Ggf sehr viele Klassen, dies kann unübersichtlich werden + ## Beispiel From 4f4d4e979fb0cca679c90bef9aab36083cc13169 Mon Sep 17 00:00:00 2001 From: Marcellii Date: Mon, 22 Jan 2018 20:07:27 +0100 Subject: [PATCH 07/41] Update Iterator Pattern.md --- Iterator Pattern.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Iterator Pattern.md b/Iterator Pattern.md index cb71025..e3fe885 100644 --- a/Iterator Pattern.md +++ b/Iterator Pattern.md @@ -6,7 +6,7 @@ ebenfalls direkt aufgerufen werden, siehe unten im Beispiel. Sie geben hier ents Methode nacheinander die Werte zurück, welche definiert werden müssen.Ein Iterator wird in der Regel mit einer `foreach` Anweisung erzeugt. -###Direkter Aufruf ohne IEnumerable Klasse +### Direkter Aufruf ohne IEnumerable Klasse ``` static void Main() { @@ -27,9 +27,9 @@ public static System.Collections.IEnumerable SomeNumbers() ```` -###Beispielcode /Hinterlegung einer IEnumerable Klasse mit Aufruf der Methode: +### Beispielcode /Hinterlegung einer IEnumerable Klasse mit Aufruf der Methode: ``` -###Aufruf der Methode im Code +### Aufruf der Methode im Code static void Main() { DaysOfTheWeek days = new DaysOfTheWeek(); @@ -43,7 +43,7 @@ static void Main() } -###Initialisierung der Klasse/Instanz +### Initialisierung der Klasse/Instanz public class DaysOfTheWeek : IEnumerable { private string[] days = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; From 14fd8a848f298eb758fb34c621d28a359a83e73b Mon Sep 17 00:00:00 2001 From: Marcellii Date: Mon, 22 Jan 2018 20:08:11 +0100 Subject: [PATCH 08/41] Update Iterator Pattern.md --- Iterator Pattern.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Iterator Pattern.md b/Iterator Pattern.md index e3fe885..26641ac 100644 --- a/Iterator Pattern.md +++ b/Iterator Pattern.md @@ -28,8 +28,9 @@ public static System.Collections.IEnumerable SomeNumbers() ```` ### Beispielcode /Hinterlegung einer IEnumerable Klasse mit Aufruf der Methode: + +#### Aufruf der Methode im Code ``` -### Aufruf der Methode im Code static void Main() { DaysOfTheWeek days = new DaysOfTheWeek(); @@ -41,9 +42,10 @@ static void Main() // Output: Sun Mon Tue Wed Thu Fri Sat Console.ReadKey(); } +``` - -### Initialisierung der Klasse/Instanz +#### Initialisierung der Klasse/Instanz +``` public class DaysOfTheWeek : IEnumerable { private string[] days = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; From b87e4f1683db1fe2c74c23588148b2f49c1bda80 Mon Sep 17 00:00:00 2001 From: Tim 'bastelfreak' Meusel Date: Mon, 22 Jan 2018 20:09:41 +0100 Subject: [PATCH 09/41] enhance README.md --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 9f1cb9d..110e651 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,8 @@ * Nikolai - [State](state.md) * Marcel - [Iterator](iterator.md) * Tim - [Decorator](decorator.md) + +## Markdown helper + +* [Markdown Cheat Sheet](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet) +* [GitHub flavored markdown](https://guides.github.com/features/mastering-markdown/) From 38d6c327462560fcae7e11e250f1be0a5c32a406 Mon Sep 17 00:00:00 2001 From: Tim 'bastelfreak' Meusel Date: Mon, 22 Jan 2018 20:10:25 +0100 Subject: [PATCH 10/41] add markdown linter --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 110e651..a4d367e 100644 --- a/README.md +++ b/README.md @@ -14,3 +14,4 @@ * [Markdown Cheat Sheet](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet) * [GitHub flavored markdown](https://guides.github.com/features/mastering-markdown/) +* [Markdown Linter](https://dlaa.me/markdownlint/) From bf296721ba438102c4cea8e77dba00184f8d6c49 Mon Sep 17 00:00:00 2001 From: Klausur - Account Berhausen Date: Mon, 22 Jan 2018 20:11:30 +0100 Subject: [PATCH 11/41] Adding state file with code and description --- state.md | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 state.md diff --git a/state.md b/state.md new file mode 100644 index 0000000..baeceed --- /dev/null +++ b/state.md @@ -0,0 +1,77 @@ +# State Pattern + +## Definition +Erlaubt einem Objekt, sein Verhalten selbständig zu ändern, wenn sich sein interner Zustand ändern soll. + +## Aufbau +Zunächst wird ein Objekt benötigt, welches verschiedene Status besitzt. +In diesem Beispiel ist es eine Ampel, welche den Status **Rot** und **Grün** besitzen kann. +Desweiteren benötigt das Objekt Funktionen zum Verändern des Zustandes, in diesem Fall das **Schalten**. +Dieses Objekt, bzw. die Funktionen können dann beliebig erweitert werden. +Ein Konto hat z.B. ein Besitzer der sich ändern kann und einen Geldbetrag. + +## Code + +### Status Klassen + +#### Vorgabe der Status Funktionen durch abstract +``` +abstract class Licht +{ + public abstract void Handle(Ampel aktuelleAmpel); +} +``` + +#### Definition Status und Aktion die durchgeführt werden soll +``` +class Rot : Licht +{ + public override void Handle(Ampel aktuelleAmpel) { + aktuelleAmpel.StatusLicht = new Gruen(); + } +} + +class Gruen : Licht +{ + public override void Handle(Ampel aktuelleAmpel) { + aktuelleAmpel.StatusLicht = new Rot(); + } +} +``` + +### Objekt mit verschiedenen Status +``` +abstract class Licht +class Ampel +{ + //Aktueller Status + private Licht _statusLicht; + + //Initialisierung + public Ampel (Licht DefaultLicht) { + this._statusLicht = DefaultLicht; + } + + // Get / Set aktueller Status + Ausgabe von neuen Wert + public Licht StatusLicht { + get { return _statusLicht; } + set { + this._statusLicht = value; + Console.WriteLine("Ampel Farbe: " + _statusLicht.GetType().Name); + } + } + + public void Schalte() + { + this._statusLicht.Handle(this); + } +} +``` + +### Beispiel Main Aufruf +``` +Ampel Fussgaenger = new Ampel(new Rot()); + +Fussgaenger.Schalte(); +Fussgaenger.Schalte(); +``` \ No newline at end of file From fc37ebb11b7ce6a9bb9cb8173703097a3515e414 Mon Sep 17 00:00:00 2001 From: Marcellii Date: Mon, 22 Jan 2018 20:15:30 +0100 Subject: [PATCH 12/41] Update and rename Iterator Pattern.md to iterator.md --- Iterator Pattern.md => iterator.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) rename Iterator Pattern.md => iterator.md (87%) diff --git a/Iterator Pattern.md b/iterator.md similarity index 87% rename from Iterator Pattern.md rename to iterator.md index 26641ac..d6e0ffd 100644 --- a/Iterator Pattern.md +++ b/iterator.md @@ -4,7 +4,7 @@ Iteratoren werden in der C# Entwicklung als Liste oder Arrays verwendet und beis in dem Programmcode hinterlegt werden. Iteratoren, müssen nicht zwangsweise eine zusätzliche Klasse besitzen, sondern können ebenfalls direkt aufgerufen werden, siehe unten im Beispiel. Sie geben hier entsprechend mit der `Yield Return` Methode nacheinander die Werte zurück, welche definiert werden müssen.Ein Iterator wird in der Regel mit -einer `foreach` Anweisung erzeugt. +einer `foreach` Anweisung erzeugt und kann nur in einer Methode oder Get Zugriffsmethode vorkommen. ### Direkter Aufruf ohne IEnumerable Klasse ``` @@ -60,3 +60,5 @@ public class DaysOfTheWeek : IEnumerable } } ``` + +Quelle: [Microsoft](https://docs.microsoft.com/de-de/dotnet/csharp/programming-guide/concepts/iterators#BKMK_SimpleIterator) From d22d607dbd83a332ecc386457418164e44805ff2 Mon Sep 17 00:00:00 2001 From: Klausur - Account Berhausen Date: Mon, 22 Jan 2018 20:15:38 +0100 Subject: [PATCH 13/41] Adding csharp highligting --- state.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/state.md b/state.md index baeceed..e7056e3 100644 --- a/state.md +++ b/state.md @@ -15,7 +15,7 @@ Ein Konto hat z.B. ein Besitzer der sich ändern kann und einen Geldbetrag. ### Status Klassen #### Vorgabe der Status Funktionen durch abstract -``` +```csharp abstract class Licht { public abstract void Handle(Ampel aktuelleAmpel); @@ -23,7 +23,7 @@ abstract class Licht ``` #### Definition Status und Aktion die durchgeführt werden soll -``` +```csharp class Rot : Licht { public override void Handle(Ampel aktuelleAmpel) { @@ -40,7 +40,7 @@ class Gruen : Licht ``` ### Objekt mit verschiedenen Status -``` +```csharp abstract class Licht class Ampel { @@ -69,7 +69,7 @@ class Ampel ``` ### Beispiel Main Aufruf -``` +```csharp Ampel Fussgaenger = new Ampel(new Rot()); Fussgaenger.Schalte(); From 74879336b12ca414c50d11fda1e90af9c82ada94 Mon Sep 17 00:00:00 2001 From: Klausur - Account Berhausen Date: Mon, 22 Jan 2018 20:19:33 +0100 Subject: [PATCH 14/41] Adding color in text / Remove tab --- state.md | 59 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 29 insertions(+), 30 deletions(-) diff --git a/state.md b/state.md index e7056e3..bd0c929 100644 --- a/state.md +++ b/state.md @@ -5,7 +5,7 @@ Erlaubt einem Objekt, sein Verhalten selbständig zu ändern, wenn sich sein int ## Aufbau Zunächst wird ein Objekt benötigt, welches verschiedene Status besitzt. -In diesem Beispiel ist es eine Ampel, welche den Status **Rot** und **Grün** besitzen kann. +In diesem Beispiel ist es eine Ampel, welche den Status ![#f03c15]Rot`#f03c15` und ![#0B610B]Grün`#0B610B` besitzen kann. Desweiteren benötigt das Objekt Funktionen zum Verändern des Zustandes, in diesem Fall das **Schalten**. Dieses Objekt, bzw. die Funktionen können dann beliebig erweitert werden. Ein Konto hat z.B. ein Besitzer der sich ändern kann und einen Geldbetrag. @@ -18,7 +18,7 @@ Ein Konto hat z.B. ein Besitzer der sich ändern kann und einen Geldbetrag. ```csharp abstract class Licht { - public abstract void Handle(Ampel aktuelleAmpel); + public abstract void Handle(Ampel aktuelleAmpel); } ``` @@ -26,45 +26,44 @@ abstract class Licht ```csharp class Rot : Licht { - public override void Handle(Ampel aktuelleAmpel) { - aktuelleAmpel.StatusLicht = new Gruen(); - } + public override void Handle(Ampel aktuelleAmpel) { + aktuelleAmpel.StatusLicht = new Gruen(); + } } class Gruen : Licht { - public override void Handle(Ampel aktuelleAmpel) { - aktuelleAmpel.StatusLicht = new Rot(); - } + public override void Handle(Ampel aktuelleAmpel) { + aktuelleAmpel.StatusLicht = new Rot(); + } } ``` ### Objekt mit verschiedenen Status ```csharp -abstract class Licht class Ampel { - //Aktueller Status - private Licht _statusLicht; - - //Initialisierung - public Ampel (Licht DefaultLicht) { - this._statusLicht = DefaultLicht; - } - - // Get / Set aktueller Status + Ausgabe von neuen Wert - public Licht StatusLicht { - get { return _statusLicht; } - set { - this._statusLicht = value; - Console.WriteLine("Ampel Farbe: " + _statusLicht.GetType().Name); - } - } - - public void Schalte() - { - this._statusLicht.Handle(this); - } + //Aktueller Status + private Licht _statusLicht; + + //Initialisierung + public Ampel (Licht DefaultLicht) { + this._statusLicht = DefaultLicht; + } + + // Get / Set aktueller Status + Ausgabe von neuen Wert + public Licht StatusLicht { + get { return _statusLicht; } + set { + this._statusLicht = value; + Console.WriteLine("Ampel Farbe: " + _statusLicht.GetType().Name); + } + } + + public void Schalte() + { + this._statusLicht.Handle(this); + } } ``` From 2163cba427402170800ce18b99dc2392177ef536 Mon Sep 17 00:00:00 2001 From: Klausur - Account Berhausen Date: Mon, 22 Jan 2018 20:24:12 +0100 Subject: [PATCH 15/41] removing fucking colors from text --- state.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/state.md b/state.md index bd0c929..88fc4f4 100644 --- a/state.md +++ b/state.md @@ -5,7 +5,7 @@ Erlaubt einem Objekt, sein Verhalten selbständig zu ändern, wenn sich sein int ## Aufbau Zunächst wird ein Objekt benötigt, welches verschiedene Status besitzt. -In diesem Beispiel ist es eine Ampel, welche den Status ![#f03c15]Rot`#f03c15` und ![#0B610B]Grün`#0B610B` besitzen kann. +In diesem Beispiel ist es eine Ampel, welche den Status Rot und Grün besitzen kann. Desweiteren benötigt das Objekt Funktionen zum Verändern des Zustandes, in diesem Fall das **Schalten**. Dieses Objekt, bzw. die Funktionen können dann beliebig erweitert werden. Ein Konto hat z.B. ein Besitzer der sich ändern kann und einen Geldbetrag. From 3dfc929aec3ee7774daad971bbb7434ed4a827ee Mon Sep 17 00:00:00 2001 From: Marcellii Date: Mon, 22 Jan 2018 20:26:05 +0100 Subject: [PATCH 16/41] add syntax highlighting add some syntax highlighting for csharp --- iterator.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/iterator.md b/iterator.md index d6e0ffd..6558899 100644 --- a/iterator.md +++ b/iterator.md @@ -7,7 +7,7 @@ Methode nacheinander die Werte zurück, welche definiert werden müssen.Ein Iter einer `foreach` Anweisung erzeugt und kann nur in einer Methode oder Get Zugriffsmethode vorkommen. ### Direkter Aufruf ohne IEnumerable Klasse -``` +```csharp static void Main() { foreach (int number in SomeNumbers()) @@ -25,12 +25,12 @@ public static System.Collections.IEnumerable SomeNumbers() yield return 8; } -```` +``` ### Beispielcode /Hinterlegung einer IEnumerable Klasse mit Aufruf der Methode: #### Aufruf der Methode im Code -``` +```csharp static void Main() { DaysOfTheWeek days = new DaysOfTheWeek(); @@ -45,7 +45,7 @@ static void Main() ``` #### Initialisierung der Klasse/Instanz -``` +```csharp public class DaysOfTheWeek : IEnumerable { private string[] days = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; From 4a3d54d6eb599297276ba72ea97fde0824e02385 Mon Sep 17 00:00:00 2001 From: Toni Eckardt Date: Mon, 22 Jan 2018 20:32:25 +0100 Subject: [PATCH 17/41] add observer.md --- observer.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 observer.md diff --git a/observer.md b/observer.md new file mode 100644 index 0000000..e91ef57 --- /dev/null +++ b/observer.md @@ -0,0 +1,13 @@ +Observer-Pattern + +Das Observer Pattern ermöglicht, dass sich Objekte (Observer, beobachtendes Objekt) +bei einem anderen Objekt (Subjekt, beobachtetes Objekt) registrieren und fortan vom +diesem informiert werden, sobald es sich ändert. + +Die Idee hinter dem Pattern liegt darin, das sich Teile von einem Programm (meist grafische Elemente), +die identische Quellen benutzen, benachrichtigt werden, wenn sich etwas ändert. + +Es werden dafür mindestens 3 Klassen benötigt. +zum Einem das Subjekt, bei dem sich der Konkrete Observer anmelden, abmelden, und benachrichtig wird. +Das Observer Interface stellt den Observern die "Update" Methode zur verfügung die von jedem Observer implementiert werden muss. +Und die Konkreten Observer können bei einer Benachrichtigung dann mit der Daten des Subjektes arbeiten. \ No newline at end of file From b9dafcb15b87b87e90b8286a2f19e6f519597cdb Mon Sep 17 00:00:00 2001 From: versuchskoerper <32618357+versuchskoerper@users.noreply.github.com> Date: Mon, 22 Jan 2018 20:43:37 +0100 Subject: [PATCH 18/41] Create singleton.md --- singleton.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 singleton.md diff --git a/singleton.md b/singleton.md new file mode 100644 index 0000000..dee5268 --- /dev/null +++ b/singleton.md @@ -0,0 +1,27 @@ +#Singleton-Pattern + +##Das Singleton gewährleistet, dass ein Objekt nur einmal im Speicher vorhanden ist. + +##Die Deklaration des Konstruktors als private verhindert, dass Objekte instanziert werden +können. Statt dessen werden sie durch eine Klassenmethode erzeugt und in einer statischen +Klassenvariablen gespeichert. Dies tut sie aber nur beim ersten einmal. Bei weiteren +Aufrufen wird lediglich das Objekt als Variable zurückgegeben. + +### Status Klassen + +#### +```csharp + + public class TSingleton + { + private TSingleton() { } + + private TSingleton instance; + + public TSingleton Get_Instance() + { + if (instance == null) { instance = new TSingleton(); } + return instance; + } + } +``` From 8d54cda0e646e8d85663aee1078b748104231e4e Mon Sep 17 00:00:00 2001 From: Tiranu91 <35527775+Tiranu91@users.noreply.github.com> Date: Mon, 22 Jan 2018 20:46:05 +0100 Subject: [PATCH 19/41] Create strategy.md --- strategy.md | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 strategy.md diff --git a/strategy.md b/strategy.md new file mode 100644 index 0000000..149f8ba --- /dev/null +++ b/strategy.md @@ -0,0 +1,56 @@ +# Strategy Pattern + +## Definition +Das Strategypattern ermöglicht es, den Algorithmus unabhängig von ihn nutzenden Klienten zu variieren. + +## Aufbau +Das Verhalten eines Objekts wird in eine Klasse (Strategieklasse) ausgelagert. Für jedes Verhalten existiert eine Klasse. +Jede Klasse die das Verhalten nutzen soll kann eine Instanz der Strategieklasse nutzen. +Es wird nicht mit der konkreten Implementierung des Verhaltens, sondern mit einem Interface gearbeitet. + +## Code + +```csharp +interface Verhalten +{ + public void Verhalten(); +} + +class Verhalten1() : Verhalten +{ + // Deff. Verhalten1 +} + +class Verhalten2() : Verhalten +{ + // Deff. Verhalten2 +} + +class Verhalten3() : Verhalten +{ + // Deff. Verhalten3 +} + +abstract class Hauptklasse +{ + Verhalten verhalten = new Verhalten1(); +} + +public void setVerhalten (Verhalten verhalten) +{ + this.verhalten = verhalten; +} + +public void Verhalten() +{ + verhalten.verhalten(); +} + +public class Client +{ + Hauptklasse hauptklasse = new Hauptklasse(); + hauptklasse.verhalten(); + hauptklasse.setVerhalten(new Verhalten2); + hauptklasse.verhalten(); +} +``` From 14d929392286272967fef55bc589d62f732a6067 Mon Sep 17 00:00:00 2001 From: Tiranu91 <35527775+Tiranu91@users.noreply.github.com> Date: Mon, 22 Jan 2018 20:47:36 +0100 Subject: [PATCH 20/41] Update strategy.md --- strategy.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/strategy.md b/strategy.md index 149f8ba..8487189 100644 --- a/strategy.md +++ b/strategy.md @@ -30,7 +30,8 @@ class Verhalten3() : Verhalten { // Deff. Verhalten3 } - +``` +```csharp abstract class Hauptklasse { Verhalten verhalten = new Verhalten1(); @@ -45,7 +46,8 @@ public void Verhalten() { verhalten.verhalten(); } - +``` +```csharp public class Client { Hauptklasse hauptklasse = new Hauptklasse(); From a56b9b360c34f77b6fcc21b988d9946a7863c6af Mon Sep 17 00:00:00 2001 From: Tim 'bastelfreak' Meusel Date: Mon, 22 Jan 2018 20:53:39 +0100 Subject: [PATCH 21/41] add example code --- decorator.md | 59 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/decorator.md b/decorator.md index e977986..0feb69c 100644 --- a/decorator.md +++ b/decorator.md @@ -22,3 +22,62 @@ erfolgen * Ggf sehr viele Klassen, dies kann unübersichtlich werden ## Beispiel + +```csharp + public abstract class Component + { + public abstract void operate(); + } + + public class ConcreteComponent1 : Component + { + override public void operate() + { + Console.WriteLine("this is a concrete component"); + } + } + + public class ConcreteComponent2 : Component + { + public override void operate() + { + Console.WriteLine("This is another concrete component"); + } + } + + public class ConcreteDecorator1 : Decorator + { + public ConcreteDecorator1(Component component) : base(component) + { + + } + override public void operate() + { + component.operate(); + Console.WriteLine("This is a concrete decorator number one"); + } + } + + + public abstract class Decorator : Component + { + protected Component component; + + public Decorator(Component component) + { + this.component = component; + } + } + + class Program + { + static void Main(string[] args) + { + Component CompA = new ConcreteComponent1(); + CompA.operate(); + CompA = new ConcreteDecorator1(CompA); + CompA.operate(); + Console.ReadLine(); + } + } +``` From 4b011ee4ca28987ec460e8839f8c32b125d67768 Mon Sep 17 00:00:00 2001 From: Tiranu91 <35527775+Tiranu91@users.noreply.github.com> Date: Mon, 22 Jan 2018 22:11:33 +0100 Subject: [PATCH 22/41] Update strategy.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Leerzeichen zwischen Überschriften und Text - Tippfehler in Codebeispiel korrigiert - Codebeispiele werden die Tage überarbeitet --- strategy.md | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/strategy.md b/strategy.md index 8487189..73d2e75 100644 --- a/strategy.md +++ b/strategy.md @@ -1,15 +1,19 @@ # Strategy Pattern ## Definition + Das Strategypattern ermöglicht es, den Algorithmus unabhängig von ihn nutzenden Klienten zu variieren. ## Aufbau + Das Verhalten eines Objekts wird in eine Klasse (Strategieklasse) ausgelagert. Für jedes Verhalten existiert eine Klasse. Jede Klasse die das Verhalten nutzen soll kann eine Instanz der Strategieklasse nutzen. Es wird nicht mit der konkreten Implementierung des Verhaltens, sondern mit einem Interface gearbeitet. ## Code +### Verhalten Interface + Implementation + ```csharp interface Verhalten { @@ -31,22 +35,28 @@ class Verhalten3() : Verhalten // Deff. Verhalten3 } ``` + +### Hauptklasse + ```csharp abstract class Hauptklasse { Verhalten verhalten = new Verhalten1(); -} -public void setVerhalten (Verhalten verhalten) -{ - this.verhalten = verhalten; -} + public void setVerhalten (Verhalten verhalten) + { + this.verhalten = verhalten; + } -public void Verhalten() -{ - verhalten.verhalten(); + public void Verhalten() + { + verhalten.verhalten(); + } } ``` + +### Klient + ```csharp public class Client { From 5eea54ecf5cc8355225860128d6676bb4f5994ac Mon Sep 17 00:00:00 2001 From: Tim Meusel Date: Mon, 22 Jan 2018 23:57:00 +0100 Subject: [PATCH 23/41] replace hard tabs --- strategy.md | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/strategy.md b/strategy.md index 73d2e75..12ba3c3 100644 --- a/strategy.md +++ b/strategy.md @@ -22,17 +22,17 @@ interface Verhalten class Verhalten1() : Verhalten { - // Deff. Verhalten1 + // Deff. Verhalten1 } class Verhalten2() : Verhalten { - // Deff. Verhalten2 + // Deff. Verhalten2 } class Verhalten3() : Verhalten { - // Deff. Verhalten3 + // Deff. Verhalten3 } ``` @@ -41,17 +41,17 @@ class Verhalten3() : Verhalten ```csharp abstract class Hauptklasse { - Verhalten verhalten = new Verhalten1(); + Verhalten verhalten = new Verhalten1(); - public void setVerhalten (Verhalten verhalten) - { - this.verhalten = verhalten; - } + public void setVerhalten (Verhalten verhalten) + { + this.verhalten = verhalten; + } - public void Verhalten() - { - verhalten.verhalten(); - } + public void Verhalten() + { + verhalten.verhalten(); + } } ``` @@ -60,9 +60,9 @@ abstract class Hauptklasse ```csharp public class Client { - Hauptklasse hauptklasse = new Hauptklasse(); - hauptklasse.verhalten(); - hauptklasse.setVerhalten(new Verhalten2); - hauptklasse.verhalten(); + Hauptklasse hauptklasse = new Hauptklasse(); + hauptklasse.verhalten(); + hauptklasse.setVerhalten(new Verhalten2); + hauptklasse.verhalten(); } ``` From 227ba8907401e9112965ffe24307377ebce12d15 Mon Sep 17 00:00:00 2001 From: Marcellii Date: Wed, 24 Jan 2018 20:56:55 +0100 Subject: [PATCH 24/41] Update iterator.md --- iterator.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/iterator.md b/iterator.md index 6558899..a1b4e91 100644 --- a/iterator.md +++ b/iterator.md @@ -7,6 +7,7 @@ Methode nacheinander die Werte zurück, welche definiert werden müssen.Ein Iter einer `foreach` Anweisung erzeugt und kann nur in einer Methode oder Get Zugriffsmethode vorkommen. ### Direkter Aufruf ohne IEnumerable Klasse + ```csharp static void Main() { @@ -30,6 +31,7 @@ public static System.Collections.IEnumerable SomeNumbers() ### Beispielcode /Hinterlegung einer IEnumerable Klasse mit Aufruf der Methode: #### Aufruf der Methode im Code + ```csharp static void Main() { @@ -45,6 +47,7 @@ static void Main() ``` #### Initialisierung der Klasse/Instanz + ```csharp public class DaysOfTheWeek : IEnumerable { From 51d331a4404900c42e7a11919393aaf642f1f1b1 Mon Sep 17 00:00:00 2001 From: Tiranu91 <35527775+Tiranu91@users.noreply.github.com> Date: Thu, 25 Jan 2018 11:14:14 +0100 Subject: [PATCH 25/41] Update strategy.md improved/commented code --- strategy.md | 51 +++++++++++++++++++++++++++++++-------------------- 1 file changed, 31 insertions(+), 20 deletions(-) diff --git a/strategy.md b/strategy.md index 12ba3c3..f3705b3 100644 --- a/strategy.md +++ b/strategy.md @@ -12,45 +12,56 @@ Es wird nicht mit der konkreten Implementierung des Verhaltens, sondern mit eine ## Code -### Verhalten Interface + Implementation +### Strategy-Interface + Konkrete Strategy ```csharp -interface Verhalten +interface Strategy() { - public void Verhalten(); + public void Algorithm(); } -class Verhalten1() : Verhalten +class ConcreteStrategy1() : Strategy { - // Deff. Verhalten1 + public void Algorithm() + { + //Code + } } -class Verhalten2() : Verhalten +class ConcreteStrategy2() : Strategy { - // Deff. Verhalten2 + public void Algorithm() + { + //Code + } } -class Verhalten3() : Verhalten +class ConcreteStrategy3() : Strategy { - // Deff. Verhalten3 + public void Algorithm() + { + //Code + } } ``` -### Hauptklasse +### Kontext ```csharp -abstract class Hauptklasse +abstract class Context { - Verhalten verhalten = new Verhalten1(); + //Instanzvariable. Standartverhalten. + Strategy strategy = new ConcreteStrategy1(); - public void setVerhalten (Verhalten verhalten) + public void setStrategy (Strategy strategy) { - this.verhalten = verhalten; + this.strategy = strategy; } - public void Verhalten() + public void Behavior() { - verhalten.verhalten(); + //Zuweisung des Verhaltens an Verhaltensobjekt + strategy.Behavior(); } } ``` @@ -60,9 +71,9 @@ abstract class Hauptklasse ```csharp public class Client { - Hauptklasse hauptklasse = new Hauptklasse(); - hauptklasse.verhalten(); - hauptklasse.setVerhalten(new Verhalten2); - hauptklasse.verhalten(); + Context context = new Context(); + context.Behavior(); //Standartverhalten + context.setStrategy(new ConcreteStrategy2); + context.Behavior(); //ConcreteStrategy2 Verhalten } ``` From ea77700f6f93185322a09d66e67222caf56d311e Mon Sep 17 00:00:00 2001 From: Toni Eckardt Date: Thu, 25 Jan 2018 17:09:07 +0100 Subject: [PATCH 26/41] =?UTF-8?q?beispiel=20code=20hinzugef=C3=BCgt=20aber?= =?UTF-8?q?=20nicht=20getest.....?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- observer.md | 98 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 95 insertions(+), 3 deletions(-) diff --git a/observer.md b/observer.md index e91ef57..a3f8349 100644 --- a/observer.md +++ b/observer.md @@ -1,4 +1,4 @@ -Observer-Pattern +##Observer-Pattern Das Observer Pattern ermöglicht, dass sich Objekte (Observer, beobachtendes Objekt) bei einem anderen Objekt (Subjekt, beobachtetes Objekt) registrieren und fortan vom @@ -8,6 +8,98 @@ Die Idee hinter dem Pattern liegt darin, das sich Teile von einem Programm (meis die identische Quellen benutzen, benachrichtigt werden, wenn sich etwas ändert. Es werden dafür mindestens 3 Klassen benötigt. -zum Einem das Subjekt, bei dem sich der Konkrete Observer anmelden, abmelden, und benachrichtig wird. +Zu einem das Subjekt, bei dem sich der Konkrete Observer anmelden, abmelden, und benachrichtig wird. Das Observer Interface stellt den Observern die "Update" Methode zur verfügung die von jedem Observer implementiert werden muss. -Und die Konkreten Observer können bei einer Benachrichtigung dann mit der Daten des Subjektes arbeiten. \ No newline at end of file +Und die Konkreten Observer können bei einer Benachrichtigung dann mit der Daten des Subjektes arbeiten. + +### Beispielcode + +#### Subjekt-Klasse + +```csharp +public abstract class Subject +{ + //Eine Liste zum verwalten von den angemeldeten Observern + private List observerList = new List(); + + //Observer wird in die Observerliste hinzugefügt + public void attach(Observer newObserver) + { + observerList.add(newObserver); + } + + //Observer wird aus der Liste entfernt + public void detach(Observer newObserver) + { + observerList.remove(newObserver); + } + + Allen observer in der Liste wird der neue Werd übergeben bzw. deren Update Methode wird aufgerufen. + protected void notifyObservers(int state) + { + for (Observer observer : observerList) + { + observer.update(state); + } + } +} +``` + + +#### Konkretes-Objekt + +```csharp + +public class ConcretSubjekt : Subject +{ + private int state; + + public Setstate(int value) + { + state = value; + } + + public int Getstate() + { + return state; + } +} +``` + +#### Observer-Klasse + +```csharp +public Interface Observer +{ + public void Update(int state) +} + +public class ConcretObserver : Observer +{ + void Update(int state) + { + Console.Writeline("Mein status ist : " + state); + } +} +``` + +#### Beispielclient + +```csharp + +public class client +{ + public void test() + { + ConcretSubjekt SubjectA = new ConcretSubjekt(); + ConcretSubjekt.attach = new ConcretObserver(); + + ConcretSubjekt.Setstate(2); + // Ausgabe in der Console: "Mein Status ist : 2" + ConcretSubjekt.Setstate(5); + // Ausgabe in der Console: "Mein Status ist : 5" + + + } +} +``` \ No newline at end of file From c73f682079e9706526f964afde64d6ea97be1a32 Mon Sep 17 00:00:00 2001 From: Toni Eckardt Date: Thu, 25 Jan 2018 17:13:05 +0100 Subject: [PATCH 27/41] es fehlte ein leerzeichen -.- --- observer.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/observer.md b/observer.md index a3f8349..d644daf 100644 --- a/observer.md +++ b/observer.md @@ -1,4 +1,4 @@ -##Observer-Pattern +## Observer-Pattern Das Observer Pattern ermöglicht, dass sich Objekte (Observer, beobachtendes Objekt) bei einem anderen Objekt (Subjekt, beobachtetes Objekt) registrieren und fortan vom From 6d055e531efdad07870623dd75391e3468d51c7f Mon Sep 17 00:00:00 2001 From: Toni Eckardt Date: Thu, 25 Jan 2018 17:14:50 +0100 Subject: [PATCH 28/41] bla --- observer.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/observer.md b/observer.md index d644daf..a87d1d7 100644 --- a/observer.md +++ b/observer.md @@ -19,22 +19,22 @@ Und die Konkreten Observer können bei einer Benachrichtigung dann mit der Daten ```csharp public abstract class Subject { - //Eine Liste zum verwalten von den angemeldeten Observern + // Eine Liste zum verwalten von den angemeldeten Observern private List observerList = new List(); - //Observer wird in die Observerliste hinzugefügt + // Observer wird in die Observerliste hinzugefügt public void attach(Observer newObserver) { observerList.add(newObserver); } - //Observer wird aus der Liste entfernt + // Observer wird aus der Liste entfernt public void detach(Observer newObserver) { observerList.remove(newObserver); } - Allen observer in der Liste wird der neue Werd übergeben bzw. deren Update Methode wird aufgerufen. + // Allen observer in der Liste wird der neue Werd übergeben bzw. deren Update Methode wird aufgerufen. protected void notifyObservers(int state) { for (Observer observer : observerList) From c2f98d04d90b2f6c91bdd24cd163ff7bc4a0ef0a Mon Sep 17 00:00:00 2001 From: quarzstein Date: Thu, 25 Jan 2018 17:18:28 +0100 Subject: [PATCH 29/41] Update observer.md geil am seil --- observer.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/observer.md b/observer.md index a87d1d7..5726f36 100644 --- a/observer.md +++ b/observer.md @@ -19,26 +19,26 @@ Und die Konkreten Observer können bei einer Benachrichtigung dann mit der Daten ```csharp public abstract class Subject { - // Eine Liste zum verwalten von den angemeldeten Observern - private List observerList = new List(); + // Eine Liste zum verwalten von den angemeldeten Observern + private List observerList = new List(); - // Observer wird in die Observerliste hinzugefügt + // Observer wird in die Observerliste hinzugefügt public void attach(Observer newObserver) - { - observerList.add(newObserver); + { + observerList.add(newObserver); } - // Observer wird aus der Liste entfernt + // Observer wird aus der Liste entfernt public void detach(Observer newObserver) - { - observerList.remove(newObserver); + { + observerList.remove(newObserver); } - // Allen observer in der Liste wird der neue Werd übergeben bzw. deren Update Methode wird aufgerufen. + // Allen observer in der Liste wird der neue Werd übergeben bzw. deren Update Methode wird aufgerufen. protected void notifyObservers(int state) - { + { for (Observer observer : observerList) - { + { observer.update(state); } } @@ -102,4 +102,4 @@ public class client } } -``` \ No newline at end of file +``` From 427bfa23ed408d6ee004da676c169236220be511 Mon Sep 17 00:00:00 2001 From: Tim Meusel Date: Thu, 25 Jan 2018 17:23:53 +0100 Subject: [PATCH 30/41] replace all hard tabs --- observer.md | 60 ++++++++++++++++++++++++++--------------------------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/observer.md b/observer.md index 5726f36..9d6cb39 100644 --- a/observer.md +++ b/observer.md @@ -33,12 +33,12 @@ public abstract class Subject { observerList.remove(newObserver); } - + // Allen observer in der Liste wird der neue Werd übergeben bzw. deren Update Methode wird aufgerufen. protected void notifyObservers(int state) { for (Observer observer : observerList) - { + { observer.update(state); } } @@ -52,17 +52,17 @@ public abstract class Subject public class ConcretSubjekt : Subject { - private int state; - - public Setstate(int value) - { - state = value; - } - - public int Getstate() - { - return state; - } + private int state; + + public Setstate(int value) + { + state = value; + } + + public int Getstate() + { + return state; + } } ``` @@ -71,15 +71,15 @@ public class ConcretSubjekt : Subject ```csharp public Interface Observer { - public void Update(int state) + public void Update(int state) } public class ConcretObserver : Observer { - void Update(int state) - { - Console.Writeline("Mein status ist : " + state); - } + void Update(int state) + { + Console.Writeline("Mein status ist : " + state); + } } ``` @@ -89,17 +89,17 @@ public class ConcretObserver : Observer public class client { - public void test() - { - ConcretSubjekt SubjectA = new ConcretSubjekt(); - ConcretSubjekt.attach = new ConcretObserver(); - - ConcretSubjekt.Setstate(2); - // Ausgabe in der Console: "Mein Status ist : 2" - ConcretSubjekt.Setstate(5); - // Ausgabe in der Console: "Mein Status ist : 5" - - - } + public void test() + { + ConcretSubjekt SubjectA = new ConcretSubjekt(); + ConcretSubjekt.attach = new ConcretObserver(); + + ConcretSubjekt.Setstate(2); + // Ausgabe in der Console: "Mein Status ist : 2" + ConcretSubjekt.Setstate(5); + // Ausgabe in der Console: "Mein Status ist : 5" + + + } } ``` From af2b3f8ae7f6bd078f04627e30a900664ff04410 Mon Sep 17 00:00:00 2001 From: Tim Meusel Date: Thu, 25 Jan 2018 17:25:32 +0100 Subject: [PATCH 31/41] purge trailing whitespace --- observer.md | 48 +++++++++++++++++++++++------------------------- 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/observer.md b/observer.md index 9d6cb39..2c948b9 100644 --- a/observer.md +++ b/observer.md @@ -1,7 +1,7 @@ ## Observer-Pattern -Das Observer Pattern ermöglicht, dass sich Objekte (Observer, beobachtendes Objekt) -bei einem anderen Objekt (Subjekt, beobachtetes Objekt) registrieren und fortan vom +Das Observer Pattern ermöglicht, dass sich Objekte (Observer, beobachtendes Objekt) +bei einem anderen Objekt (Subjekt, beobachtetes Objekt) registrieren und fortan vom diesem informiert werden, sobald es sich ändert. Die Idee hinter dem Pattern liegt darin, das sich Teile von einem Programm (meist grafische Elemente), @@ -10,38 +10,38 @@ die identische Quellen benutzen, benachrichtigt werden, wenn sich etwas ändert. Es werden dafür mindestens 3 Klassen benötigt. Zu einem das Subjekt, bei dem sich der Konkrete Observer anmelden, abmelden, und benachrichtig wird. Das Observer Interface stellt den Observern die "Update" Methode zur verfügung die von jedem Observer implementiert werden muss. -Und die Konkreten Observer können bei einer Benachrichtigung dann mit der Daten des Subjektes arbeiten. +Und die Konkreten Observer können bei einer Benachrichtigung dann mit der Daten des Subjektes arbeiten. ### Beispielcode #### Subjekt-Klasse ```csharp -public abstract class Subject -{ +public abstract class Subject +{ // Eine Liste zum verwalten von den angemeldeten Observern - private List observerList = new List(); + private List observerList = new List(); // Observer wird in die Observerliste hinzugefügt public void attach(Observer newObserver) - { + { observerList.add(newObserver); - } + } // Observer wird aus der Liste entfernt public void detach(Observer newObserver) - { + { observerList.remove(newObserver); - } - - // Allen observer in der Liste wird der neue Werd übergeben bzw. deren Update Methode wird aufgerufen. + } + + // Allen observer in der Liste wird der neue Werd übergeben bzw. deren Update Methode wird aufgerufen. protected void notifyObservers(int state) - { - for (Observer observer : observerList) - { - observer.update(state); - } - } + { + for (Observer observer : observerList) + { + observer.update(state); + } + } } ``` @@ -53,12 +53,12 @@ public abstract class Subject public class ConcretSubjekt : Subject { private int state; - - public Setstate(int value) + + public Setstate(int value) { state = value; } - + public int Getstate() { return state; @@ -69,7 +69,7 @@ public class ConcretSubjekt : Subject #### Observer-Klasse ```csharp -public Interface Observer +public Interface Observer { public void Update(int state) } @@ -93,13 +93,11 @@ public class client { ConcretSubjekt SubjectA = new ConcretSubjekt(); ConcretSubjekt.attach = new ConcretObserver(); - + ConcretSubjekt.Setstate(2); // Ausgabe in der Console: "Mein Status ist : 2" ConcretSubjekt.Setstate(5); // Ausgabe in der Console: "Mein Status ist : 5" - - } } ``` From 83cf8f4879787381d4a53f3b25dd5bf6ef5cec83 Mon Sep 17 00:00:00 2001 From: Marcellii Date: Sun, 28 Jan 2018 13:19:50 +0100 Subject: [PATCH 32/41] Update Iterator to the correct One --- iterator.md | 224 ++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 173 insertions(+), 51 deletions(-) diff --git a/iterator.md b/iterator.md index a1b4e91..c182a5e 100644 --- a/iterator.md +++ b/iterator.md @@ -1,67 +1,189 @@ -# Iterator Pattern +# Iterator-Pattern -Iteratoren werden in der C# Entwicklung als Liste oder Arrays verwendet und beispielsweise als Interface `IEnumerable` -in dem Programmcode hinterlegt werden. Iteratoren, müssen nicht zwangsweise eine zusätzliche Klasse besitzen, sondern können -ebenfalls direkt aufgerufen werden, siehe unten im Beispiel. Sie geben hier entsprechend mit der `Yield Return` -Methode nacheinander die Werte zurück, welche definiert werden müssen.Ein Iterator wird in der Regel mit -einer `foreach` Anweisung erzeugt und kann nur in einer Methode oder Get Zugriffsmethode vorkommen. +## Definition -### Direkter Aufruf ohne IEnumerable Klasse +Das Iterator-Pattern wird verwendet, um über eine Liste zu traversieren ohne hier entsprechend die Struktur oder das Muster zu +veröffentlichen. Heißt, eine Liste nach und nach Abzugehen. Der Iterator ist in diesem Fall der `Cursor`, welche durch die Kollektion +durchgeht. + +## UML + +![alt text](https://github.com/Marcellii/designpatterns/blob/master/iterator_uml.png) + +## Anwendung + +Um einen Iterator Anwenden zu können, muss zuvor ein Iterator Interface angelegt werden, wo die entsprechenden Methoden (next, +first,isDone und CurrentItem) erzeugt werden. Anschließend wird ein ConcreteIterator als Klasse definiert, damit der Iterator weiß, an +welcher Stelle dieser sich gerade befindet. + +Beispielcode für die Erstellung und Erzeugung eines Iterator-Pattern: + +### Erzeugen des Iterator Interfaces ```csharp -static void Main() -{ - foreach (int number in SomeNumbers()) - { - Console.Write(number.ToString() + " "); - } - // Output: 3 5 8 - Console.ReadKey(); -} - -public static System.Collections.IEnumerable SomeNumbers() -{ - yield return 3; - yield return 5; - yield return 8; -} +interface IIterator +{ + string FirstItem { get;} + string NextItem{ get;} + string CurrentItem{ get;} + bool IsDone { get;} +} +``` + +### Erzeugen des Interfaces für die Aggregator Kollektion +```csharp +interface IAggregate +{ + IIterator GetIterator(); + string this[int itemIndex]{set;get;} + int Count{get;} +} ``` -### Beispielcode /Hinterlegung einer IEnumerable Klasse mit Aufruf der Methode: +#### Erzeugen der Konkreten Klasse für die Aggreator Kollektion + +```csharp +class MyAggregate : IAggregate +{ + List<string> values_ = null; + + public MyAggregate() + { + values_ = new List<string>(); + } + + #region IAggregate Members + + public IIterator GetIterator() + { + return new MyIterator(this); + } + + #endregion -#### Aufruf der Methode im Code + public string this[int itemIndex] + { + get + { + if (itemIndex < values_.Count) + { + return values_[itemIndex]; + } + else + { + return string.Empty; + } + } + set + { + values_.Add(value); + } + } + + public int Count + { + get + { + return values_.Count; + } + } +} +``` + +#### Implementieren des Konrekten Interator ```csharp -static void Main() -{ - DaysOfTheWeek days = new DaysOfTheWeek(); - - foreach (string day in days) - { - Console.Write(day + " "); - } - // Output: Sun Mon Tue Wed Thu Fri Sat - Console.ReadKey(); -} +class MyIterator : IIterator +{ + IAggregate aggregate_ = null; + int currentIndex_ = 0; + + public MyIterator(IAggregate aggregate) + { + aggregate_ = aggregate; + } + + #region IIterator Members + + public string FirstItem + { + get + { + currentIndex_ = 0; + return aggregate_[currentIndex_]; + } + } + + public string NextItem + { + get + { + currentIndex_ += 1; + + if (IsDone == false) + { + return aggregate_[currentIndex_]; + } + else + { + return string.Empty; + } + } + } + + public string CurrentItem + { + get + { + return aggregate_[currentIndex_]; + } + } + + public bool IsDone + { + get + { + if (currentIndex_ < aggregate_.Count) + { + return false; + } + return true; + } + } + + #endregion +} ``` -#### Initialisierung der Klasse/Instanz +### Einfügen in das eigentliche Programm ```csharp -public class DaysOfTheWeek : IEnumerable -{ - private string[] days = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; - - public IEnumerator GetEnumerator() - { - for (int index = 0; index < days.Length; index++) - { - // Yield each day of the week. Aus - yield return days[index]; - } - } -} +class Program +{ + static void Main(string[] args) + { + MyAggregate aggr = new MyAggregate(); + + aggr[0] = "1"; + aggr[1] = "2"; + aggr[2] = "3"; + aggr[3] = "4"; + aggr[4] = "5"; + aggr[5] = "6"; + aggr[6] = "7"; + aggr[7] = "8"; + aggr[8] = "9"; + aggr[9] = "10"; + + IIterator iter = aggr.GetIterator(); + + for (string s = iter.FirstItem; iter.IsDone == false; s = iter.NextItem ) + { + Console.WriteLine(s); + } + } +} ``` -Quelle: [Microsoft](https://docs.microsoft.com/de-de/dotnet/csharp/programming-guide/concepts/iterators#BKMK_SimpleIterator) +Quelle: [Codeproject](https://www.codeproject.com/Articles/362986/Understanding-and-Implementing-the-Iterator-Patter) From 46f843601164224b2e0d88269e336f34c9176da9 Mon Sep 17 00:00:00 2001 From: Marcellii Date: Sun, 28 Jan 2018 13:21:13 +0100 Subject: [PATCH 33/41] fix some issues --- iterator.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/iterator.md b/iterator.md index c182a5e..4748922 100644 --- a/iterator.md +++ b/iterator.md @@ -156,7 +156,7 @@ class MyIterator : IIterator } ``` -### Einfügen in das eigentliche Programm +#### Einfügen in das eigentliche Programm ```csharp class Program From deb4302f6b96daa4d1cd2a644c2acd183b5effb6 Mon Sep 17 00:00:00 2001 From: Marcellii Date: Sun, 28 Jan 2018 14:17:53 +0100 Subject: [PATCH 34/41] fix typos --- iterator.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/iterator.md b/iterator.md index 4748922..d3bf084 100644 --- a/iterator.md +++ b/iterator.md @@ -8,7 +8,7 @@ durchgeht. ## UML -![alt text](https://github.com/Marcellii/designpatterns/blob/master/iterator_uml.png) +![alt text](iterator_uml.png) ## Anwendung @@ -46,11 +46,11 @@ interface IAggregate ```csharp class MyAggregate : IAggregate { - List<string> values_ = null; + List values_ = null; public MyAggregate() { - values_ = new List<string>(); + values_ = new List(); } #region IAggregate Members @@ -66,7 +66,7 @@ class MyAggregate : IAggregate { get { - if (itemIndex < values_.Count) + if (itemIndex < values_.Count) { return values_[itemIndex]; } @@ -88,7 +88,7 @@ class MyAggregate : IAggregate return values_.Count; } } -} +} ``` #### Implementieren des Konrekten Interator @@ -144,7 +144,7 @@ class MyIterator : IIterator { get { - if (currentIndex_ < aggregate_.Count) + if (currentIndex_ < aggregate_.Count) { return false; } From 2c40454b202613de219ceb43c6fdbaa605990326 Mon Sep 17 00:00:00 2001 From: Marcellii Date: Sun, 28 Jan 2018 14:23:37 +0100 Subject: [PATCH 35/41] Add files via upload --- iterator_uml.png | Bin 0 -> 23910 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 iterator_uml.png diff --git a/iterator_uml.png b/iterator_uml.png new file mode 100644 index 0000000000000000000000000000000000000000..be03eab952463c895aec57caf834b2d75ffdfe4c GIT binary patch literal 23910 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 ZeZKv&g~+QfhWY7hY^>}oIs3e5{{gW}LnQzJ literal 0 HcmV?d00001 From f163ef0c48bd600b51eafdd76f9faf4cad0d73d9 Mon Sep 17 00:00:00 2001 From: versuchskoerper <32618357+versuchskoerper@users.noreply.github.com> Date: Sun, 28 Jan 2018 14:24:01 +0100 Subject: [PATCH 36/41] Update singleton.md --- singleton.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/singleton.md b/singleton.md index dee5268..a4a0de0 100644 --- a/singleton.md +++ b/singleton.md @@ -1,8 +1,8 @@ -#Singleton-Pattern +# Singleton-Pattern -##Das Singleton gewährleistet, dass ein Objekt nur einmal im Speicher vorhanden ist. +## Das Singleton gewährleistet, dass ein Objekt nur einmal im Speicher vorhanden ist. -##Die Deklaration des Konstruktors als private verhindert, dass Objekte instanziert werden +## Die Deklaration des Konstruktors als private verhindert, dass Objekte instanziert werden können. Statt dessen werden sie durch eine Klassenmethode erzeugt und in einer statischen Klassenvariablen gespeichert. Dies tut sie aber nur beim ersten einmal. Bei weiteren Aufrufen wird lediglich das Objekt als Variable zurückgegeben. From 37a10fb7c5f973548fd241b8e25ea4a226f0dd7d Mon Sep 17 00:00:00 2001 From: versuchskoerper <32618357+versuchskoerper@users.noreply.github.com> Date: Sun, 28 Jan 2018 14:25:28 +0100 Subject: [PATCH 37/41] Update singleton.md --- singleton.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/singleton.md b/singleton.md index a4a0de0..a9f1d62 100644 --- a/singleton.md +++ b/singleton.md @@ -1,8 +1,8 @@ -# Singleton-Pattern +## Singleton-Pattern -## Das Singleton gewährleistet, dass ein Objekt nur einmal im Speicher vorhanden ist. - -## Die Deklaration des Konstruktors als private verhindert, dass Objekte instanziert werden +### +Das Singleton gewährleistet, dass ein Objekt nur einmal im Speicher vorhanden ist. +Die Deklaration des Konstruktors als private verhindert, dass Objekte instanziert werden können. Statt dessen werden sie durch eine Klassenmethode erzeugt und in einer statischen Klassenvariablen gespeichert. Dies tut sie aber nur beim ersten einmal. Bei weiteren Aufrufen wird lediglich das Objekt als Variable zurückgegeben. From 6d88eff78fbd2c2d69c8454eca15cf3af1559d90 Mon Sep 17 00:00:00 2001 From: versuchskoerper <32618357+versuchskoerper@users.noreply.github.com> Date: Sun, 28 Jan 2018 14:40:36 +0100 Subject: [PATCH 38/41] Update singleton.md --- singleton.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/singleton.md b/singleton.md index a9f1d62..f24e81a 100644 --- a/singleton.md +++ b/singleton.md @@ -1,11 +1,11 @@ ## Singleton-Pattern -### -Das Singleton gewährleistet, dass ein Objekt nur einmal im Speicher vorhanden ist. -Die Deklaration des Konstruktors als private verhindert, dass Objekte instanziert werden -können. Statt dessen werden sie durch eine Klassenmethode erzeugt und in einer statischen -Klassenvariablen gespeichert. Dies tut sie aber nur beim ersten einmal. Bei weiteren -Aufrufen wird lediglich das Objekt als Variable zurückgegeben. +### Das Singleton gewährleistet, dass ein Objekt nur einmal im Speicher vorhanden ist. + +#### +Der Zugriffsmodifikator "private" für den Standard-Konstruktor verhindert die Erzeugung von Objekte durch diesen. +Statt dessen erfolgt die Instanzierung durch eine Klassenmethode, welche das Objekt in einer statischen Klassenvariablen speichert. +Dies geschieht beim erstmaligen Aufruf der Methode. Bei weiteren Aufrufen wird lediglich das Objekt als Variable zurückgegeben. ### Status Klassen From a05a20495cef420668ba19bd250b2ae7d293ceb4 Mon Sep 17 00:00:00 2001 From: versuchskoerper <32618357+versuchskoerper@users.noreply.github.com> Date: Sun, 28 Jan 2018 14:47:01 +0100 Subject: [PATCH 39/41] Update singleton.md --- singleton.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/singleton.md b/singleton.md index f24e81a..df2be11 100644 --- a/singleton.md +++ b/singleton.md @@ -1,15 +1,12 @@ ## Singleton-Pattern -### Das Singleton gewährleistet, dass ein Objekt nur einmal im Speicher vorhanden ist. +### Das Singleton als Erzeugungsmuster gewährleistet, dass ein Objekt nur einmal im Speicher vorhanden ist #### Der Zugriffsmodifikator "private" für den Standard-Konstruktor verhindert die Erzeugung von Objekte durch diesen. Statt dessen erfolgt die Instanzierung durch eine Klassenmethode, welche das Objekt in einer statischen Klassenvariablen speichert. Dies geschieht beim erstmaligen Aufruf der Methode. Bei weiteren Aufrufen wird lediglich das Objekt als Variable zurückgegeben. -### Status Klassen - -#### ```csharp public class TSingleton From 410e7dba1441c043e8e482fd31547be9898df70d Mon Sep 17 00:00:00 2001 From: Marcellii Date: Mon, 29 Jan 2018 14:37:55 +0100 Subject: [PATCH 40/41] delete all "_" --- iterator.md | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/iterator.md b/iterator.md index d3bf084..ed90b5c 100644 --- a/iterator.md +++ b/iterator.md @@ -46,11 +46,11 @@ interface IAggregate ```csharp class MyAggregate : IAggregate { - List values_ = null; + List values = null; public MyAggregate() { - values_ = new List(); + values = new List(); } #region IAggregate Members @@ -68,7 +68,7 @@ class MyAggregate : IAggregate { if (itemIndex < values_.Count) { - return values_[itemIndex]; + return values[itemIndex]; } else { @@ -77,7 +77,7 @@ class MyAggregate : IAggregate } set { - values_.Add(value); + values.Add(value); } } @@ -85,7 +85,7 @@ class MyAggregate : IAggregate { get { - return values_.Count; + return values.Count; } } } @@ -96,12 +96,12 @@ class MyAggregate : IAggregate ```csharp class MyIterator : IIterator { - IAggregate aggregate_ = null; - int currentIndex_ = 0; + IAggregate aggregate = null; + int currentIndex = 0; public MyIterator(IAggregate aggregate) { - aggregate_ = aggregate; + aggregate = aggregate; } #region IIterator Members @@ -110,8 +110,8 @@ class MyIterator : IIterator { get { - currentIndex_ = 0; - return aggregate_[currentIndex_]; + currentIndex = 0; + return aggregate[currentIndex]; } } @@ -119,11 +119,11 @@ class MyIterator : IIterator { get { - currentIndex_ += 1; + currentIndex += 1; if (IsDone == false) { - return aggregate_[currentIndex_]; + return aggregate[currentIndex]; } else { @@ -136,7 +136,7 @@ class MyIterator : IIterator { get { - return aggregate_[currentIndex_]; + return aggregate[currentIndex]; } } @@ -144,7 +144,7 @@ class MyIterator : IIterator { get { - if (currentIndex_ < aggregate_.Count) + if (currentIndex < aggregate.Count) { return false; } From 2535c83f88809ecb07e1b50b5db825931d89e750 Mon Sep 17 00:00:00 2001 From: Nikolai L Date: Mon, 29 Jan 2018 18:23:43 +0100 Subject: [PATCH 41/41] Update state.md --- state.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/state.md b/state.md index 88fc4f4..8fafd5f 100644 --- a/state.md +++ b/state.md @@ -1,3 +1,4 @@ + # State Pattern ## Definition @@ -73,4 +74,4 @@ Ampel Fussgaenger = new Ampel(new Rot()); Fussgaenger.Schalte(); Fussgaenger.Schalte(); -``` \ No newline at end of file +```