티스토리 뷰
Doridori C# 강의 3) 74. 디자인 패턴 2_구조 패턴 (Adapter, Decorator)
꼬꼬마도리도리 2024. 12. 15. 15:55======================================================
안녕하세요 Doridori 입니다.
디자인 패턴 1강의를 올린지 두달 정도가 되어 가는데 그 당시에 공황에 우울증까지 와서 조금 심각 했는데 시간이 지나니 또 흘러가는 듯 합니다.
지금은 어느정도 정리가 되고 안정을 찾아가고 있습니다.
두달 전 이라고 하니 중간에 별 것 안한 것 같지만 쇼츠도 꾸준히 만들고 도도하다 강의도 올리고 이번 강의도 준비하고 블로그에 '알쓸신프' 라고 그냥 심심 할 때 가지고 놀 수 있는 프로그램들도 만들어서 올리고... 열심히 지냈습니다. ㅋㅋ
그 외 개인적인 일정으로는 친구들과 계를 하는데 캠핑을 하면서 스트레스도 풀고(블로그에 술 리뷰가 확 늘어나는 시점이 친구들을 만날 때 쯤 됩니다.), 연말 카디 콘서트도 다녀오고, 정말 친한 지인이 부탁해서 거의 10년만에 축가도 부르고..
잡혀 있던 바쁜 일정 들이 끝나서 드라마도 한번 정주행 빡!!! 때리고!!!
요즘은 대학전쟁 시즌2와 피의게임 시즌3를 즐겨 보고 있습니다. ^^b
어느정도 의욕이 필요 하기는 하지만 힘을 조금 빼고 지내야 할 필요도 있지 않나 생각이 드는 요즘이네요.
올해도 마무리를 할 시점이 다 되어가는데 올해 초에 정했던 목표에 대해서 한번 생각해보는 시간을 가져도 좋을 듯 합니다.
다들 너무 쫓기는 마음을 가지지 않았으면 하고 여유를 찾고 행복하셨으면 좋겠습니다.
감사합니다. ^^
======================================================
74. 디자인 패턴 2_구조 패턴 (Adapter, Decorator)
Soruce) (기존 생성 패턴 예제를 별도로 작성 했는데 이번에 구조 패턴을 추가 하면서 하나의 Source로 통합 하였습니다.)
교재)
디자인 패턴에 대해 3번째로 다루는 강의 입니다.
기본적인 개론을 먼저 이야기 하였고 그 다음에 생성패턴에서 자주 사용 되는 것들에 대한 예제, 이번에는 그 다음 내용인 구조 패턴에 대한 예제를 가지고 왔습니다.
2024.10.13 - [C#/C# 강좌 Winform] - Doridori C# 강의 3) 73. 디자인 패턴 1_생성 패턴 (Singleton, Factory)
흐름을 따라 가보고 구조를 머리속에 넣어 놓으면 도움이 되지 않을까 싶은 내용이긴 하네요 ^^
1. 어댑터 패턴(adapter Pattern)
2. 데코레이터 패턴(Decorator Pattern)
개인적인 의견으로는 이정도 구조를 사용 하려고 하면 구조적인 설계를 어느 정도 해 본뒤에 가능 하다고 생각 되기 때문에 , 이런 강의를 하나 보고 한번에 적용하기는 쉽지 않을 듯 하고 이론적인 부분과 흐름들을 머리속에 넣어 놓으면 실무를 하면서 이런 패턴들을 접했을 때 머리속에서 띵~! 하면서 떠오르는 시점이 있지 않을까 생각 합니다.
그 때에 실무에서 이렇게 적용 되는 구나 라고 깨닿게 되면 그 이후는 이 패턴들을 본인의 것으로 가져 갈 수 있겠다 싶네요.
강의)
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
49
50
51
52
53
54
55
56
57
|
#region Structure Pattern Inner Function
private void fAdapter()
{
Log(enLogLevel.Info_L1, $"Adapter) Start");
string sRet = string.Empty;
Adaptee adaptee = new Adaptee();
ITarget target = new Adapter(adaptee);
// 클라이언트는 ITarget 인터페이스만 알면 됩니다. (Adaptee에 있는 Method는 몰라도 됨)
sRet = target.Request();
Log(enLogLevel.Info_L2, $"Adapter Request) {sRet}");
// 기본 Interface 구현
ITarget basictarget = new BasicTarget();
sRet = basictarget.Request();
Log(enLogLevel.Info_L2, $"Basic Request) {sRet}");
Log(enLogLevel.Info_L1, $"Adapter) End");
}
private void fDecorator()
{
/*
Log(enLogLevel.Info_L1, $"Decorator) Start");
IComponent component = new ConcreteComponent();
IComponent decoratedComponent = new ConcreteDecoratorA(component);
// 데코레이터가 적용된 컴포넌트 사용
decoratedComponent.Operation();
*/
Log(enLogLevel.Info_L1, $"Decorator) Start");
// 기본 커피
ICoffee coffee = new Espresso();
Log(enLogLevel.Info_L2, $"Decorator coffee) {coffee.GetDescription()} - {coffee.GetCost()}");
// Milk 추가
coffee = new MilkDecorator(coffee);
Log(enLogLevel.Info_L2, $"Decorator milk) {coffee.GetDescription()} - {coffee.GetCost()}");
// Sugar 추가
coffee = new SugarDecorator(coffee);
Log(enLogLevel.Info_L2, $"Decorator sugar) {coffee.GetDescription()} - {coffee.GetCost()}");
Log(enLogLevel.Info_L1, $"Decorator) End");
}
#endregion
|
cs |
Adapter.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
|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DesignPattern.StructurePatterns
{
public interface ITarget
{
string Request();
}
/// <summary>
/// Interface를 사용 하여 해당 Adaptee에 Business Logic을 구현 하려고 하나 사용 Function이 달라 Interface를 연결하지 못함
/// </summary>
public class Adaptee
{
public string SpecificRequest()
{
return $"interface에 있는 Method(Request())와 Adaptee에 있는 Method(SpecificRequest)가 호환이 되지 않으니 Adapter에서 호환 시켜서 호출";
}
}
/// <summary>
/// Adapter Class를 생성 하여 Interface를 구현하고 해당 구간에 Adaptee를 가져와서 Business Logic을 연결
/// </summary>
public class Adapter : ITarget
{
private Adaptee _adaptee;
public Adapter(Adaptee adaptee)
{
_adaptee = adaptee;
}
public string Request()
{
// 어댑터가 Adaptee의 메서드를 변환하여 호출
return _adaptee.SpecificRequest();
}
}
/// <summary>
/// 대부분 이렇게 구현을 하나 기존 구현 되어 있는 Class가 있을 경우 Interface를 연결 해서 사용하고 싶을 때 쓰면 될듯
/// </summary>
public class BasicTarget : ITarget
{
public string Request()
{
return $"기본 Interface의 구현";
}
}
}
|
cs |
Decorator.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
|
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DesignPattern.StructurePatterns
{
public interface ICoffee
{
string GetDescription();
double GetCost();
}
// 2. ConcreteComponent: 기본 구현
public class Espresso : ICoffee
{
public string GetDescription() => "Espresso"; // => 단순 반환을 위한 키워드
public double GetCost() => 2.0; // 기본 가격
}
// 3. Decorator: 기본 데코레이터 클래스
public abstract class CoffeeDecorator : ICoffee
{
protected ICoffee _coffee;
public CoffeeDecorator(ICoffee coffee)
{
_coffee = coffee;
}
public virtual string GetDescription() => _coffee.GetDescription();
public virtual double GetCost() => _coffee.GetCost();
}
// 4. ConcreteDecorator: 구체적인 데코레이터들
public class MilkDecorator : CoffeeDecorator
{
public MilkDecorator(ICoffee coffee) : base(coffee) { }
public override string GetDescription() => _coffee.GetDescription() + ", Milk"; //espresso, Milk
public override double GetCost() => _coffee.GetCost() + 0.5; // Milk 추가 가격 // 2.5
}
public class SugarDecorator : CoffeeDecorator
{
public SugarDecorator(ICoffee coffee) : base(coffee) { }
public override string GetDescription() => _coffee.GetDescription() + ", Sugar"; // espresso, Milk, Sugar
public override double GetCost() => _coffee.GetCost() + 0.2; // Sugar 추가 가격 // 2.7
}
}
|
cs |
'C# > C# 강좌 Winform' 카테고리의 다른 글
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 |
Doridori C# 강의 3) 69. Rest API (Server Program) (10) | 2023.10.20 |
- Total
- Today
- Yesterday
- 와인
- C#
- 위스키
- 서울
- 도리도리
- 게임
- 전통주
- 증류주
- Visual Studio
- 나들이
- 가볼만한곳
- 칵테일
- C# 강의
- 도리도리 C#
- 모바일
- 가볼만한 곳
- 광저우
- C# 기초 강의
- C# 강좌
- 아이랑
- 하이볼
- 소주
- 맛집
- 막걸리
- WinForm
- 보드카
- 주말
- 술
- 프로그램 강의
- 맥주
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |