티스토리 뷰
Doridori C# 강의 3) 75. 디자인 패턴 3_행동 패턴 (Observer, Strategy)
꼬꼬마도리도리 2025. 2. 25. 21:07======================================================
안녕하세요 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 |
'C# > C# 강좌 Winform' 카테고리의 다른 글
Doridori C# 강의 3) 74. 디자인 패턴 2_구조 패턴 (Adapter, Decorator) (6) | 2024.12.15 |
---|---|
Doridori C# 강의 3) 73. 디자인 패턴 1_생성 패턴 (Singleton, Factory) (0) | 2024.10.17 |
Doridori C# 강의 3) 72. DLL 생성 및 사용 (2) | 2024.08.03 |
Doridori C# 강의 3) 71. Debugging (Program Error 확인 및 해결) (2) | 2024.01.01 |
Doridori C# 강의 3) 70. Rest API (Client Program) (0) | 2023.10.29 |
- Total
- Today
- Yesterday
- C#
- 광저우
- Visual Studio
- 도리도리
- 모바일
- 와인
- 위스키
- 보드카
- 주말
- 나들이
- 도리도리 C#
- 가볼만한곳
- 칵테일
- 가볼만한 곳
- 맛집
- 맥주
- 소주
- 아이랑
- C# 강좌
- 증류주
- 게임
- C# 강의
- 서울
- WinForm
- 전통주
- 막걸리
- C# 기초 강의
- 하이볼
- 술
- 프로그램 강의
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |