C#/C# 강좌 Winform

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)

75. 디자인 패턴 3_행동 패턴 (Observer, Strategy).zip
0.27MB

 

 

교재)

75. 디자인 패턴 3_행동 패턴 (Observer, Strategy) .pdf
0.23MB

 

 

 

디자인 패턴 중 마지막인 행동패턴에 대한 내용 입니다. 

해당 내용 중 자주 사용 되는 패턴 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