티스토리 뷰

======================================================

 안녕하세요 Doridori 입니다.

디자인 패턴 1강의를 올린지 두달 정도가 되어 가는데 그 당시에 공황에 우울증까지 와서 조금 심각 했는데 시간이 지나니 또 흘러가는 듯 합니다. 

지금은 어느정도 정리가 되고 안정을 찾아가고 있습니다. 

두달 전 이라고 하니 중간에 별 것 안한 것 같지만 쇼츠도 꾸준히 만들고 도도하다 강의도 올리고 이번 강의도 준비하고 블로그에 '알쓸신프' 라고 그냥 심심 할 때 가지고 놀 수 있는 프로그램들도 만들어서 올리고... 열심히 지냈습니다. ㅋㅋ

그 외 개인적인 일정으로는 친구들과 계를 하는데 캠핑을 하면서 스트레스도 풀고(블로그에 술 리뷰가 확 늘어나는 시점이 친구들을 만날 때 쯤 됩니다.), 연말 카디 콘서트도 다녀오고, 정말 친한 지인이 부탁해서 거의 10년만에 축가도 부르고..

잡혀 있던 바쁜 일정 들이 끝나서 드라마도 한번 정주행 빡!!! 때리고!!!

요즘은 대학전쟁 시즌2와 피의게임 시즌3를 즐겨 보고 있습니다. ^^b

어느정도 의욕이 필요 하기는 하지만 힘을 조금 빼고 지내야 할 필요도 있지 않나 생각이 드는 요즘이네요. 

올해도 마무리를 할 시점이 다 되어가는데 올해 초에 정했던 목표에 대해서 한번 생각해보는 시간을 가져도 좋을 듯 합니다. 

다들 너무 쫓기는 마음을 가지지 않았으면 하고 여유를 찾고 행복하셨으면 좋겠습니다.

감사합니다. ^^

======================================================

 

74. 디자인 패턴 2_구조 패턴 (Adapter, Decorator)

Soruce) (기존 생성 패턴 예제를 별도로 작성 했는데 이번에 구조 패턴을 추가 하면서 하나의 Source로 통합 하였습니다.)

74. 디자인 패턴 2_구조 패턴 (Adapter, Decorator).zip
0.25MB

 

교재)

74. 디자인 패턴 2_구조 패턴 (Adapter, Decorator).pdf
0.23MB

 

 

 디자인 패턴에 대해 3번째로 다루는 강의 입니다. 

기본적인 개론을 먼저 이야기 하였고 그 다음에 생성패턴에서 자주 사용 되는 것들에 대한 예제, 이번에는 그 다음 내용인 구조 패턴에 대한 예제를 가지고 왔습니다. 

2024.10.13 - [C#/C# 강좌 Winform] - Doridori C# 강의 3) 73. 디자인 패턴 1_생성 패턴 (Singleton, Factory)

 

Doridori C# 강의 3) 73. 디자인 패턴 1_생성 패턴 (Singleton, Factory)

====================================================== 안녕하세요 Doridori 입니다.생활을 하면서 제법 힘든 시기가 아닌가 싶은 생각이 드는 요즘 입니다. 업무 스트레스 때문인지 속이 좋지 않아 밥을 잘 먹

cwkcw.tistory.com

 

흐름을 따라 가보고 구조를 머리속에 넣어 놓으면 도움이 되지 않을까 싶은 내용이긴 하네요 ^^

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

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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
글 보관함