Skip to content

Commit ec5f5e3

Browse files
Update Design Patterns
Implementação dos padrões comportamentais: Observer, State, Strategy, Template Method e Visitor
1 parent fc1ccce commit ec5f5e3

File tree

5 files changed

+329
-0
lines changed

5 files changed

+329
-0
lines changed

ObserverPattern.cs

+82
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
// Observer.cs
2+
3+
using System;
4+
using System.Collections.Generic;
5+
6+
public interface IObserver
7+
{
8+
void Update(string message);
9+
}
10+
11+
public class ConcreteObserver : IObserver
12+
{
13+
private readonly string _name;
14+
15+
public ConcreteObserver(string name)
16+
{
17+
_name = name;
18+
}
19+
20+
public void Update(string message)
21+
{
22+
Console.WriteLine($"Observer {_name} recebeu a mensagem: {message}");
23+
}
24+
}
25+
26+
public interface ISubject
27+
{
28+
void Attach(IObserver observer);
29+
void Detach(IObserver observer);
30+
void Notify();
31+
}
32+
33+
public class ConcreteSubject : ISubject
34+
{
35+
private readonly List<IObserver> _observers = new List<IObserver>();
36+
private string _state;
37+
38+
public void Attach(IObserver observer)
39+
{
40+
_observers.Add(observer);
41+
}
42+
43+
public void Detach(IObserver observer)
44+
{
45+
_observers.Remove(observer);
46+
}
47+
48+
public void Notify()
49+
{
50+
foreach (var observer in _observers)
51+
{
52+
observer.Update(_state);
53+
}
54+
}
55+
56+
public string State
57+
{
58+
get => _state;
59+
set
60+
{
61+
_state = value;
62+
Notify();
63+
}
64+
}
65+
}
66+
67+
// Testando Observer
68+
public class Program
69+
{
70+
public static void Main()
71+
{
72+
var subject = new ConcreteSubject();
73+
74+
var observer1 = new ConcreteObserver("Observer 1");
75+
var observer2 = new ConcreteObserver("Observer 2");
76+
77+
subject.Attach(observer1);
78+
subject.Attach(observer2);
79+
80+
subject.State = "Novo estado!";
81+
}
82+
}

StatePattern.cs

+58
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
// State.cs
2+
3+
using System;
4+
5+
public interface IState
6+
{
7+
void Handle();
8+
}
9+
10+
public class ConcreteStateA : IState
11+
{
12+
public void Handle()
13+
{
14+
Console.WriteLine("Estado A: Realizando ação A.");
15+
}
16+
}
17+
18+
public class ConcreteStateB : IState
19+
{
20+
public void Handle()
21+
{
22+
Console.WriteLine("Estado B: Realizando ação B.");
23+
}
24+
}
25+
26+
public class Context
27+
{
28+
private IState _state;
29+
30+
public Context(IState state)
31+
{
32+
_state = state;
33+
}
34+
35+
public void SetState(IState state)
36+
{
37+
_state = state;
38+
}
39+
40+
public void Request()
41+
{
42+
_state.Handle();
43+
}
44+
}
45+
46+
// Testando State
47+
public class Program
48+
{
49+
public static void Main()
50+
{
51+
var context = new Context(new ConcreteStateA());
52+
53+
context.Request();
54+
55+
context.SetState(new ConcreteStateB());
56+
context.Request();
57+
}
58+
}

StrategyPattern.cs

+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
// Strategy.cs
2+
3+
using System;
4+
5+
public interface IStrategy
6+
{
7+
void Execute();
8+
}
9+
10+
public class ConcreteStrategyA : IStrategy
11+
{
12+
public void Execute()
13+
{
14+
Console.WriteLine("Estratégia A: Execução da estratégia A.");
15+
}
16+
}
17+
18+
public class ConcreteStrategyB : IStrategy
19+
{
20+
public void Execute()
21+
{
22+
Console.WriteLine("Estratégia B: Execução da estratégia B.");
23+
}
24+
}
25+
26+
public class Context
27+
{
28+
private IStrategy _strategy;
29+
30+
public Context(IStrategy strategy)
31+
{
32+
_strategy = strategy;
33+
}
34+
35+
public void SetStrategy(IStrategy strategy)
36+
{
37+
_strategy = strategy;
38+
}
39+
40+
public void ExecuteStrategy()
41+
{
42+
_strategy.Execute();
43+
}
44+
}
45+
46+
// Testando Strategy
47+
public class Program
48+
{
49+
public static void Main()
50+
{
51+
var context = new Context(new ConcreteStrategyA());
52+
context.ExecuteStrategy();
53+
54+
context.SetStrategy(new ConcreteStrategyB());
55+
context.ExecuteStrategy();
56+
}
57+
}

TemplateMethod.cs

+62
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
// TemplateMethod.cs
2+
3+
using System;
4+
5+
public abstract class AbstractClass
6+
{
7+
public void TemplateMethod()
8+
{
9+
StepOne();
10+
StepTwo();
11+
StepThree();
12+
}
13+
14+
protected abstract void StepOne();
15+
protected abstract void StepTwo();
16+
17+
// Passo fixo
18+
protected void StepThree()
19+
{
20+
Console.WriteLine("Passo três: Passo fixo.");
21+
}
22+
}
23+
24+
public class ConcreteClassA : AbstractClass
25+
{
26+
protected override void StepOne()
27+
{
28+
Console.WriteLine("Classe A: Executando passo um.");
29+
}
30+
31+
protected override void StepTwo()
32+
{
33+
Console.WriteLine("Classe A: Executando passo dois.");
34+
}
35+
}
36+
37+
public class ConcreteClassB : AbstractClass
38+
{
39+
protected override void StepOne()
40+
{
41+
Console.WriteLine("Classe B: Executando passo um.");
42+
}
43+
44+
protected override void StepTwo()
45+
{
46+
Console.WriteLine("Classe B: Executando passo dois.");
47+
}
48+
}
49+
50+
// Testando Template Method
51+
public class Program
52+
{
53+
public static void Main()
54+
{
55+
var classA = new ConcreteClassA();
56+
classA.TemplateMethod();
57+
58+
var classB = new ConcreteClassB();
59+
classB.TemplateMethod();
60+
}
61+
}
62+

VisitorPattern.cs

+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
// Visitor.cs
2+
3+
using System;
4+
5+
public interface IElement
6+
{
7+
void Accept(IVisitor visitor);
8+
}
9+
10+
public class ConcreteElementA : IElement
11+
{
12+
public void Accept(IVisitor visitor)
13+
{
14+
visitor.Visit(this);
15+
}
16+
17+
public void OperationA()
18+
{
19+
Console.WriteLine("Elemento A: Executando operação A.");
20+
}
21+
}
22+
23+
public class ConcreteElementB : IElement
24+
{
25+
public void Accept(IVisitor visitor)
26+
{
27+
visitor.Visit(this);
28+
}
29+
30+
public void OperationB()
31+
{
32+
Console.WriteLine("Elemento B: Executando operação B.");
33+
}
34+
}
35+
36+
public interface IVisitor
37+
{
38+
void Visit(ConcreteElementA elementA);
39+
void Visit(ConcreteElementB elementB);
40+
}
41+
42+
public class ConcreteVisitor : IVisitor
43+
{
44+
public void Visit(ConcreteElementA elementA)
45+
{
46+
elementA.OperationA();
47+
Console.WriteLine("Visitor: Realizando visita ao Elemento A.");
48+
}
49+
50+
public void Visit(ConcreteElementB elementB)
51+
{
52+
elementB.OperationB();
53+
Console.WriteLine("Visitor: Realizando visita ao Elemento B.");
54+
}
55+
}
56+
57+
// Testando Visitor
58+
public class Program
59+
{
60+
public static void Main()
61+
{
62+
var elementA = new ConcreteElementA();
63+
var elementB = new ConcreteElementB();
64+
65+
var visitor = new ConcreteVisitor();
66+
67+
elementA.Accept(visitor);
68+
elementB.Accept(visitor);
69+
}
70+
}

0 commit comments

Comments
 (0)