본문 바로가기

Study/디자인 패턴24

[C#/Unity][디자인패턴] 방문자 패턴(Visitor Pattern) 1. 방문자 패턴이란? - 알고리즘을 객체 구조에서 분리시키는 패턴. - 데이터 구조와 데이터 처리를 분리하여, 데이터 구조 내부에 방문자 클래스를 만들어 각각을 처리한다. - 방문자와 방문 공간을 분리하여, 방문 공간이 방문자를 맞이하고, 이후에 대한 행동은 방문자에게 위임하는 패턴. 2. 방문자 패턴을 사용하는 경우 - 자료구조(데이터)와 자료구조를 처리하는 로직(알고리즘)을 분리해야 할 경우 - 데이터 구조보다 알고리즘이 더 자주 바뀌는 경우 - 복잡한 객제 구조(ex. 객체 트리)의 모든 요소에 대해 작업을 수행해야 하는 경우 3. 방문자 패턴의 장점 - 구조를 수정하지 않고, 새로운 동작을 기존의 객체 구조에 추가할 수 있다. - 작업 대상(방문 공간)과 작업 항목(방문 공간을 가지고 하는 일).. 2023. 12. 31.
[C#/Unity][디자인패턴] 책임 연쇄 패턴(Chain of Responsibility Pattern) 1. 책임 연쇄 패턴이란? - 사용자의 요청을 처리함에 있어, 연쇄(Chain)적으로 연결되어있는 처리 객체(Handler)들을 이용하는 패턴. - 클라이언트로부터의 요청을 처리할 수 있는 처리 객체를 집합(Chain)으로 만들어 부여함으로 결합을 느슨하게 하기 위해 만들어진 디자인 패턴. - 일반적으로 요청을 처리할 수 있는 객체를 찾을 때까지 집합 안에서 요청을 전달한다. - 각각의 인스턴스의 책임들이 체인처럼 연쇄되어 있다는 뜻이다. - 요청을 보내는 쪽과 처리하는 쪽을 분리시키고, 요청을 보내는 쪽에서 해당 요청을 처리하는 핸들러가 어떤 구체적인 타입인지에 상관없이 디커플링된 상태에서 요청을 처리할 수 있게끔 해주는 패턴. - 클라이언트의 요청에 대한 세세한 처리를 하나의 객체가 몽땅 하는 것이 .. 2023. 12. 29.
[C#/Unity][디자인패턴] 템플릿 메서드 패턴(Template Method Pattern) 1. 템플릿 메서드 패턴이란? - 기능의 뼈대(템플릿)와 실제 구현을 분리하는 패턴. - 알고리즘의 구조를 메서드에 정의하고, 하위 클래스에서 알고리즘 구조의 변경헚이 알고리즘을 재정의하는 패턴. - 상속을 통해 슈퍼클래스의 기능을 확장할 때 사용하는 가장 대표적인 방법. - 변하지 않는 기능을 슈퍼클래스에 만들어두고, 자주 변경되면 확장할 기능은 서브클래스에 만든다. 2. 템플릿 메서드 패턴을 사용하는 경우 - 알고리즘이 단계별로 나누어 지거나, 같은 역할을 하는 메서드이지만 여러곳에서 다른 형태로 사용이 필요한 경우 사용. - 알고리즘의 특정 단계들만 확장할 수 있도록 하고 싶지만 알고리즘의 구조는 확장하지 못하도록 하고 싶은 경우 3. 템플릿 메서드 패턴의 장점 - 중복을 줄이고, 코드의 재사용성을.. 2023. 12. 28.
[C#/Unity][디자인패턴] 전략 패턴(Strategy Pattern) 1. 전략 패턴이란? - 정책 패턴(Policy Pattern)이라고도 불리며 특정 알고리즘을 별도로 분리하여 설계하는 방법을 말함. - 알고리즘군을 정의하고 캡슐화해서 각각의 알고리즘군을 수정해서 사용할 수 있게 해줌. - 실행 중에 알고리즘(전략)을 선택하여 객체 동작을 실시간으로 바뀌도록 할 수 있게 하는 행위 디자인 패턴. - 객체의 행위를 변경하고 싶을 때, 직접 수정하지 않고 전략이라 불리는 캡슐화된 알고리즘을 변경. - 특정한 계열의 알고리즘들을 정의하고, 각 알고리즘을 캡슐화하며, 이 알고리즘들을 해당 계열 안에서 상호 교체가 가능하도록 만든다. - 객체들이 할 수 있는 각각의 행위에 대해 전략 클래스를 생성하고, 유사한 행위들을 캡슐화하는 인터페이스를 정의하여 객체의 행위를 동적으로 바꾸.. 2023. 12. 28.
[C#/Unity][디자인패턴] 상태 패턴(State Pattern) 1. 상태 패턴이란? - 객체가 상태에 따라 행위를 다르게 할 때, 직접 상태를 체크하여 상태에 따른 행위를 호출하는 것이 아니라 상태를 객체화하여 필요에 따라 다르게 행동하도록 위임하는 디자인 패턴. - 상태를 조건문으로 검사해서 행위를 달리하는 것이 아닌, 상태를 객체화하여 상태가 행동을 할 수 있도록 위임하는 패턴. - 객체의 특정 상태를 클래스로 선언하고, 클래스에서는 해당 상태에서 할 수 있는 행위들을 메서드로 정의한다. - 상태란, 객체가 가질 수 있는 어떤 조건이나 상황을 의미한다. 2. 상태 패턴을 사용하는 경우 - 상태 전이를 위한 로직이 지나치게 복잡한 경우 - 현재 상태에 따라 다르게 행동하는 객체가 있는 경우 - 상태들의 수가 많고, 상태별로 코드가 자주 변경되는 경우 3. 상태 패.. 2023. 12. 27.
[C#/Unity][디자인패턴] 옵저버 패턴(Observer Pattern) 1. 옵저버 패턴이란? - 하나의 관찰 대상(객체)를 여러 개의 관찰자(옵저버)들이 관찰하고(일대다 구조), 객체의 상태 변화시 객체가 직접 옵저버들에게 상태 변화를 통지하고, 옵저버들은 해당 통지를 받는 구독 메커니즘을 가짐. - 옵저버(관찰자)들이 관찰하고 있는 대상자의 상태 변화가 있을 때마다, 대상자는 목록의 각 관찰자들에게 직접 알리고 관찰자들은 알림을 받아 조치를 취하는 행동 패턴. - 객체의 상태 변화를 관찰하는 관찰자(옵저버)들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴. - public/subscribe (발행/구독) 모델로도 알려져 있음. - 관찰자들은 수동적으로 객체에게 정보를 전달 받기만을 기다린.. 2023. 12. 27.
[C#/Unity][디자인패턴] 메멘토 패턴(Memento Pattern) 1. 메멘토 패턴이란? - 객체를 이전 상태로 되돌릴 수 있는 기능을 제공하는 패턴. - 객체의 상태 정보를 저장하고 사용자의 필요에 의해 원하는 시점의 데이터를 복원할 수 있는 패턴. - 캡슐화를 유지하면서 객체 내부 상태를 외부에 저장하는 방법. 2. 메멘토 패턴을 사용하는 경우 - 어떤 객체의 상태를 변경하고, 이 변경 내용을 이후에 취소하거나 이전 상태로 복원하려고 할 때 사용 - 객체의 field, getter, setter들을 직접 접근하는 것이 해당 객체의 캡슐화를 위반할 때 사용 3. 메멘토 패턴의 장점 - 객체의 모든 정보를 외부로 노출시키지 않고 캡슐화를 지킬 수 있다. - 캡슐화를 위반하지 않고 객체의 상태 스냅샷들을 생성할 수 있다. - 코드를 단순화 시킬 수 있다. 4. 메멘토 패.. 2023. 12. 21.
[C#/Unity][디자인패턴] 중재자 패턴(Mediator Pattern) 1. 중재자 패턴이란? - 객체 간의 직접 통신을 제한하고 중재자 객체를 통해서만 협력하도록 하는 패턴. - 소프트웨어 공학에서 어떻게 객체들의 집합이 상호작용하는지를 함축해놓은 객체를 정의 - 객체간의 상호작용을 캡슐화하는 디자인 패턴 - 중재자라는 객체 안에서 서로 다른 객체들을 캡슐화하여 객체들이 더 이상 직접적으로 상호작용하지 않고 중재자를 통해서만 커뮤니케이션하도록 함. - 객체 간의 혼란스러운 의존 관계들을 줄일 수 있는 패턴 2. 중재자 패턴을 사용하는 경우 - 객체 간의 많은 의존관계를 가지거나 상호작용이 복잡해질 때 사용. - 일부 클래스들이 다른 클래스들과 단단하게 결합하여 변경하기 어려울 대 사용. - 타 컴포넌트들에 너무 의존하여 다른 프로그램에서 컴포넌트를 재사용할 수 없는 경우 .. 2023. 12. 20.
[C#/Unity][디자인패턴] 반복자 패턴(Iterator Pattern) 1. 반복자 패턴이란? - 일련의 데이터 집합에 대해 순차적인 접근(순회)을 지원하는 패턴. - 컬렉션 구현 방법을 노출시키지 않으면서도 그 집합체 안에 들어있는 모든 항목에 접근할 수 있는 방법을 제공하는 패턴. - 반복자를 사용하여 컨테이너를 가로지르며 컨테이너의 요소들에 접근하는 디자인 패턴. - 컬렉션의 요소들을 순회하는 패턴. 2. 반복자 패턴을 사용하는 경우 - 해시나 트리구조와 같이 저장순서가 정해지지 않고 적재된 데이터들을 순회하는 방법을 정하는 경우 - 컬렉션에 상관없이 객체 접근 순회 방식을 통일하고자 할 경우 - 컬렉션을 순회하는 다양한 방법을 지원하고 싶은 경우 - 컬렉션의 복잡한 내부 구조를 클라이언트로부터 숨기고 싶은 경우(편의 + 보안) - 데이터 저장 컬렉션 종류가 변경 가능.. 2023. 12. 16.
[C#/Unity][디자인패턴] 인터프리터 패턴(Interpreter Pattern) 1. 인터프리터 패턴이란? - 자주 등장하는 문법을 별개의 간단한 언어로 정의하고 재사용하는 패턴. - Expression이라는 추상 클래스를 만들어 사용하는 경우가 많음. - 반복되는 문제 패턴을 언어 또는 문법으로 정의하고 확장할 수 있음. - 트리구조로 인해 컴포지트 패턴과 유사한 형태를 띈다. 2. 인터프리터 패턴을 사용하는 경우 - 특정 언어 또는 문법이 반복되서 사용되는 경우 3. 인터프리터 패턴의 장점 1) 캡슐화 : 문법과 해석을 기본 로직에서 분리하여 별도의 클래스로 캡슐화되므로 모듈화되어 유지보수가 쉬워진다. 2) 쉬운 확장 : Expression 클래스에서 파생된 새로운 구현 클래스만 추가하면 DSL을 쉽게 확장할 수 있다. 3) 가독성 : 문법과 규칙을 계층구조를 이용해 명시적으로 .. 2023. 12. 12.
[C#/Unity][디자인패턴] 커맨드 패턴(Command Pattern) 1. 커맨드 패턴이란? - 실행될 기능을 캡슐화함으로써 주어진 여러 기능을 실행할 수 있는 재사용성이 높은 클래스를 설계하는 패턴. - 객체의 행위(메서드)를 클래스로 만들어 캡슐화하는 패턴. - 요청을 요청에 대한 모든 정보가 포함된 독립실행형 객체로 변환하는 행동 패턴. - 요청의 실행을 지연하거나 대기열에 넣을 수 있도록 하고, 또 실행 취소할 수 있는 작업도 지원한다. - 요청을 객체의 형태로 캡슐화하여 나중에 이용할 수 있도록 메서드 이름, 매개변수 등 요청에 필요한 정보를 저장 또는 로깅, 취소할 수 있게 해주는 패턴. 2. 커맨드 패턴을 사용하는 경우 - 요청이 서로 다른 사용자, 시간 또는 프로젝트에 따라 달라질 수 있을 경우 - 이벤트를 발생시키는 클래스를 변경하지 않고 재사용하고 싶은 .. 2023. 12. 7.
[C#/Unity][디자인패턴] 브릿지 패턴(Bridge Pattern) 1. 브릿지 패턴이란? - 클래스의 구현 계층과 추상 계층을 분리하여 각자의 독립적인 변형을 용이하게 한다. - 구현부에서 추상층을 분리하여 각자 독립적으로 변형이 가능하고 확장이 가능하도록 한다. - 객체의 확장성을 향상시키기 위한 패턴. 2. 브릿지 패턴을 사용하는 경우 - 클래스의 내용과 클래스에서 처리하는 일이 자주 변화하는 경우 - 기존 시스템에 부수적인 새로운 기능들을 지속적으로 추가 해야하는 경우 - 부모 추상 클래스가 기본 규칙 세트를 정의하고 구체적인 클래스가 추가 규칙을 추가하고 싶은 경우 - 객체에 대한 참조가 있는 추상 클래스가 있고 각 구체적인 클래스에서 정의될 추상 메서드가 있는 경우 3. 브릿지 패턴의 장점 - 새로운 인터페이스를 정의하여 기존 프로그램의 변경없이 기능을 확장할.. 2023. 12. 5.