CSharp/Design Pattern(17)
-
State
내부 상태가 변경될 때 객체가 동작을 변경할 수 있도록 하는 동작 디자인 패턴 객체가 특정 상태에 따라 행위를 달리하는 상황에서, 자신이 직접 상태를 체크하여 상태에 따라 행위를 호출하지 않고, 상태를 객체화 하여 상태가 행동을 할 수 있도록 위임하는 패턴 문제점 특정 class 의 state 가 여러가지 있고 이 각각의 state 를 처리 하려면 조건문을 부득이 하게 사용하게 된다. 이러한 조건문은 state 가 늘어 날 수록 복잡해 지게 되고 각 조건들은 또한 세부 조건을 갖게 되어 유지보수가 힘들어 지는 class 가 생성된다. 해결책 각 state 들의 처리를 하나의 class 에서 하지 않고 조건에 따라 각각 다른 state class 로 캡슐화 하여 context 라는 원래 개체에서 논리를 숨..
2022.03.17 -
Memento
구현의 세부 사항을 공개하지 않고 개체의 이전 상태를 저장하고 복원할 수 있는 동작 디자인 패턴 문제 텍스트 편집기의 기능중에 undo 기능을 만들려고 한다고 가정해 보자 특정 command 를 하게 되면 내용을 history 에 snapshot 형태로 저장할 것이다. 비공개 필드등은 처리 하기 어렵다. 편집기 관련 class 를 수정 하게 되었을때 개체 상태를 복사하는 class를 함께 변경해야 한다. 실제 텍스트, 커서 좌표, 현재 스크롤 위치 등을 포함해야 한다. 이러한 값들은 모두 상태가 노출되어야 한다. (public) 해결책 상태 스냅샷 생성을 해당 상태의 실제 소유자인 발신자 객체에게 위임 편집기 클래스 자체가 스냅샷 생성 memento 라는 특수 객체에 객체 상태의 복사본을 저장 class..
2022.03.16 -
Iterator
기반이 되는 표현을 노출시키지 않고 연속적으로 객체 요소에 접근하는 방법을 제공하는 것 다시말해 aggregate 유형에 무관한 동일 순차 접근 방법을 제공하는것이며 , 여기서 aggregate란 반복자객체를 생성하기위한 인터페이스를 정의하는것이고 iterator 란 요소에 접근 할 수 있고 순회 할 수 있는 인터페이스를 정의하는것이다. 문제 컬렉션의 각 요소에 순차적으로 액세스할 수 있는 방법이 필요할때list 같은 collection 이라면 쉬운 작업일 수 있으나 복잡한 트리 구조라면 이야기가 달라진다.또 해당 tree 를 깊이 우선으로 탐색 할지 너비 우선으로 탐색 할지에 따라 방법도 달라진다. 해결책 컬렉션의 순회 동작 자체를 iterator 라는 별도의 객체로 추출하는 것 Iterator 는 다..
2022.03.15 -
Chain of Responsibility
정의 일련의 핸들러를 따라 요청을 전달할 수 있는 행동 디자인 패턴 요청을 받으면 각 핸들러는 요청을 처리할지 아니면 체인의 다음 핸들러로 전달할지 결정 온라인 주문 시스템 있다고 가정하자. 1. 인증된 사용자만 주문을 생성한다. 2. 관리자는 모든 주문에 대한 액세스 권한이 있다. 시간이 흐른 후 몇가지를 추가 구현 하였다. 3. 유효성 검사 단계를 추가 4. 동일한 IP 주소에서 오는 반복적으로 실패한 요청을 필터링 (무차별 암호 해독 문제 처리) 5. Caching ( performance 향상) 문제점 새로운 기능을 추가할 때마다 코드가 점점 많아짐. 하나의 검사를 변경 하면 다른 검사에 영향을 주기도 함. 일부 기능 (Aunthentication) 만 재사용 하려면 코드를 복사해 가야함. 이로인..
2022.03.14 -
Proxy
어떤 객체를 사용하고자 할때, 객체를 직접적으로 참조 하는것이 아니라, 해당 객체를 대행(대리, proxy)하는 객체를 통해 대상객체에 접근 하는 패턴 아래와 같은 경우에 사용된다. 지연 초기화 액세스 제어 원격 서비스의 로컬 실행 로깅 요청 캐싱 스마트 참조 class diagram 어떤 class 의 method 이전과 이후에 특정 작업(Logging) 을 하는 것을 proxy 로 처리해보자 이전에 사용한 flyweight 와 함께 사용해 보자 flyweight 관련 코드 public class HeavyObject { private readonly string _name; private readonly int _age; public HeavyObject(string name, int age) { T..
2022.03.11 -
Flyweight
동일하거나 유사한 객체들 사이에 가능한 많은 데이터를 서로 공유하여 사용하도록 하여 메모리 사용량을 최소화하는 소프트웨어 디자인 패턴이다. class diagram 예제 public class HeavyObject { private readonly string _name; private readonly int _age; public HeavyObject(string name, int age) { Thread.Sleep(TimeSpan.FromSeconds(1)); _name = name; _age = age; } public void Execution() { Console.WriteLine($"Name : {_name} , Age : {_age}, !! Long live Ukraine !! хай жив..
2022.03.11