Doridori C# 강의 3) 75. 디자인 패턴 3_행동 패턴 (Observer, Strategy)
======================================================
안녕하세요 Doridori 입니다.
작년 말 부터 몸이며 마음이며 만신창이가 됬는데 1월에 최대치로 치솟더니 이제 점점 나아지고 있는 듯 합니다.
올해 예정되어 있는 큰 일들이 많은데 액땜 했다 생각하면 이제 좋은 일만 생기지 않을지 기대해봅니다. ^^b
작년 하반기 부터 준비 했던 디자인 패턴에 대한 내용이 이제 슬슬 마무리 단계에 접어드는 듯 합니다.
1. 디자인 패턴의 개요: https://cwkcw.tistory.com/844
2. 생성 패턴 (Singleton, Factory): https://cwkcw.tistory.com/851
3. 구조 패턴 (Adapter, Decorator): https://cwkcw.tistory.com/880
4. 행동 패턴 (Observer, Strategy): 이번 강의 입니다.
5. 마무리 정리: 이번에 올리고 마지막 내용을 정리 할 듯 합니다.
내용이 내용이라 조회수가 높진 않지만 저 자신과의 약속을 지켰다는 생각을 하면서 마지막 까지 열심히 달려 보도록 하겠습니다.
화이팅 하시죠!!
감사합니다. ^^
======================================================
75. 디자인 패턴 3_행동 패턴 (Observer, Strategy)
Soruce) (디자인패턴 통합 Source)
교재)
디자인 패턴 중 마지막인 행동패턴에 대한 내용 입니다.
해당 내용 중 자주 사용 되는 패턴 2가지에 대해서 준비 하였습니다.
장기간으로 이런 소스들을 준비 하다 보니 너무 이론적인 부분으로 밖에 접근 할 수 밖에 없어서 아쉽긴 합니다.
원래는 실제로 사용 되는 예제 위주로 준비를 많이 하는데 시간도 그렇고 이번에는 아쉬움이 많이 남는 프로젝트네요.
하지만 마무리를 해야 다음으로 나아 갈 수 있기 때문에 잘 마무리 해보도록 하겠습니다.
강의)
Source)
Main) (전체 소스를 넣으면 기존 패턴까지 들어가서 행동 패턴 호출 부분만 넣었습니다.)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
private void fObserver()
{
Log(enLogLevel.Info_L1, $"Observer) Start");
string sRet = string.Empty;
NewsPublisher newsPublisher = new NewsPublisher(); // 뉴스 발행 객체 생성
// 두 명의 구독자(옵저버) 생성
Subscriber user1 = new Subscriber("Alice");
Subscriber user2 = new Subscriber("Bob");
// 옵저버 등록
newsPublisher.Attach(user1);
newsPublisher.Attach(user2);
// 모든 옵저버에게 뉴스 전달
sRet = newsPublisher.Notify("Breaking News: Observer Pattern in C#!");
Log(enLogLevel.Info_L2, $"Observer Notify) {sRet}");
// 한 명의 옵저버 제거
newsPublisher.Detach(user1);
// 남아있는 옵저버에게만 뉴스 전달
sRet = newsPublisher.Notify("Another News Update!");
Log(enLogLevel.Info_L2, $"Observer Notify) {sRet}");
Log(enLogLevel.Info_L1, $"Observer) End");
}
private void fStrategy()
{
Log(enLogLevel.Info_L1, $"Strategy) Start");
string sRet = string.Empty;
Context context = new Context(); // 컨텍스트 객체 생성
// 전략 A 설정 및 실행
context.SetStrategy(new ConcreteStrategyA());
sRet = context.ExecuteStrategy();
Log(enLogLevel.Info_L2, $"Strategy Execute) {sRet}");
// 전략 B 설정 및 실행
context.SetStrategy(new ConcreteStrategyB());
sRet = context.ExecuteStrategy();
Log(enLogLevel.Info_L2, $"Strategy Execute) {sRet}");
Log(enLogLevel.Info_L1, $"Strategy) End");
}
|
cs |
Observer.cs)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DesignPattern.BehavioralPatterns
{
internal class Observer
{
}
// 옵저버 인터페이스
public interface IObserver
{
string Update(string message); // 주제로부터 메시지를 받아 처리하는 메서드
}
// 주제(Subject) 인터페이스
public interface ISubject
{
void Attach(IObserver observer); // 옵저버 추가
void Detach(IObserver observer); // 옵저버 제거
string Notify(string message); // 모든 옵저버에게 메시지 전달
}
// 주제(Subject) 클래스
public class NewsPublisher : ISubject
{
private List<IObserver> observers = new List<IObserver>(); // 옵저버 리스트 관리
public void Attach(IObserver observer) => observers.Add(observer); // 옵저버 추가
public void Detach(IObserver observer) => observers.Remove(observer); // 옵저버 제거
public string Notify(string message) // 모든 옵저버에게 메시지 전달
{
StringBuilder sb = new StringBuilder(); // return message 저장용
foreach (var observer in observers)
{
sb.Append(observer.Update(message) + " | ");
}
return sb.ToString();
}
}
// 구체적인 옵저버 클래스
public class Subscriber : IObserver
{
private string _name;
public Subscriber(string name) => _name = name; // 구독자 이름을 생성자에서 설정
public string Update(string message) // 주제로부터 메시지를 받아 출력
{
return $"{_name} received news update: {message}";
}
}
}
|
cs |
Strategy.cs)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DesignPattern.BehavioralPatterns
{
internal class Strategy
{
}
// 전략 인터페이스
public interface IStrategy
{
string Execute(); // 전략 실행 메서드
}
// 전략 A
public class ConcreteStrategyA : IStrategy
{
public string Execute()
{
return "Executing Strategy A"; // 전략 A 실행 시 동작
}
}
// 전략 B
public class ConcreteStrategyB : IStrategy
{
public string Execute()
{
return "Executing Strategy B"; // 전략 B 실행 시 동작
}
}
// 컨텍스트 클래스
public class Context
{
private IStrategy _strategy; // 현재 설정된 전략을 저장할 변수
public void SetStrategy(IStrategy strategy) => _strategy = strategy; // 실행할 전략을 설정하는 메서드
public string ExecuteStrategy()
{
return _strategy.Execute(); // 현재 설정된 전략을 실행하는 메서드
}
}
}
|
cs |