Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
765a22f
Create Iterator Pattern
Jan 22, 2018
50fd696
add decorator.md
bastelfreak Jan 22, 2018
03a0de5
add description for decorator pattern
bastelfreak Jan 22, 2018
f043fee
Update Iterator Pattern
Jan 22, 2018
3b09f6a
Rename Iterator Pattern to Iterator Pattern.md
Jan 22, 2018
593a219
add positive/negative list for decorator
bastelfreak Jan 22, 2018
4f4d4e9
Update Iterator Pattern.md
Jan 22, 2018
14fd8a8
Update Iterator Pattern.md
Jan 22, 2018
b87e4f1
enhance README.md
bastelfreak Jan 22, 2018
38d6c32
add markdown linter
bastelfreak Jan 22, 2018
bf29672
Adding state file with code and description
Jan 22, 2018
fc37ebb
Update and rename Iterator Pattern.md to iterator.md
Jan 22, 2018
d22d607
Adding csharp highligting
Jan 22, 2018
58a1611
Merge pull request #1 from Marcellii/interator
Jan 22, 2018
7487933
Adding color in text / Remove tab
Jan 22, 2018
2163cba
removing fucking colors from text
Jan 22, 2018
3dfc929
add syntax highlighting
Jan 22, 2018
4a3d54d
add observer.md
Jan 22, 2018
b9dafcb
Create singleton.md
versuchskoerper Jan 22, 2018
8d54cda
Create strategy.md
Tiranu91 Jan 22, 2018
14d9293
Update strategy.md
Tiranu91 Jan 22, 2018
a56b9b3
add example code
bastelfreak Jan 22, 2018
4b011ee
Update strategy.md
Tiranu91 Jan 22, 2018
5eea54e
replace hard tabs
bastelfreak Jan 22, 2018
10d61b6
Merge pull request #5 from Tiranu91/strategy
bastelfreak Jan 22, 2018
227ba89
Update iterator.md
Jan 24, 2018
51d331a
Update strategy.md
Tiranu91 Jan 25, 2018
c25b8ba
Merge pull request #7 from Tiranu91/strategy
bastelfreak Jan 25, 2018
ea77700
beispiel code hinzugefügt aber nicht getest.....
Jan 25, 2018
c73f682
es fehlte ein leerzeichen -.-
Jan 25, 2018
6d055e5
bla
Jan 25, 2018
c2f98d0
Update observer.md
quarzstein Jan 25, 2018
427bfa2
replace all hard tabs
bastelfreak Jan 25, 2018
af2b3f8
purge trailing whitespace
bastelfreak Jan 25, 2018
0eeadf3
Merge pull request #3 from quarzstein/blumenkohl
bastelfreak Jan 25, 2018
83cf8f4
Update Iterator to the correct One
Jan 28, 2018
46f8436
fix some issues
Jan 28, 2018
deb4302
fix typos
Jan 28, 2018
2c40454
Add files via upload
Jan 28, 2018
f163ef0
Update singleton.md
versuchskoerper Jan 28, 2018
37a10fb
Update singleton.md
versuchskoerper Jan 28, 2018
6d88eff
Update singleton.md
versuchskoerper Jan 28, 2018
a05a204
Update singleton.md
versuchskoerper Jan 28, 2018
410e7db
delete all "_"
Jan 29, 2018
2535c83
Update state.md
Jan 29, 2018
fcf3a0e
Merge pull request #4 from versuchskoerper/master
bastelfreak Mar 11, 2018
387ef1d
Merge pull request #1 from Marcellii/patch-1
bastelfreak May 14, 2018
cc8328b
Merge pull request #2 from StoneCat/state
bastelfreak May 14, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,9 @@
* 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/)
* [Markdown Linter](https://dlaa.me/markdownlint/)
83 changes: 83 additions & 0 deletions decorator.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
# 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.

## 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

```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();
}
}
```
189 changes: 189 additions & 0 deletions iterator.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,189 @@
# Iterator-Pattern

## Definition

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](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
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;}
}
```

#### 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

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
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
}
```

#### Einfügen in das eigentliche Programm

```csharp
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: [Codeproject](https://www.codeproject.com/Articles/362986/Understanding-and-Implementing-the-Iterator-Patter)
Binary file added iterator_uml.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
103 changes: 103 additions & 0 deletions observer.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
## 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.
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.

### Beispielcode

#### Subjekt-Klasse

```csharp
public abstract class Subject
{
// Eine Liste zum verwalten von den angemeldeten Observern
private List<Observer> observerList = new List<Observer>();

// 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"
}
}
```
Loading