💡행위 패턴이란?
클래스나 객체의 책임 분배 방법과 관련된 패턴
💡행위 패턴 특징
하나의 객체로 수행할 수 없는 것을 여러 객체로 분배하여 결합도 최소화
💡행위 패턴 종류
Chain-of-Responsibility
Command
Interpreter
Iterator
Mediator
Memento
Observer
State
Strategy
Template Method
Visitor
💡Chain-of-Responsibility 패턴
정의
: 사슬 방식으로 연결된 객체가 요청이 들어오면 그 요청을 수행하지 못하는 객체라면 다음 객체에 넘김
ex) JAVA의 try catch문
장점
: 내부 구조를 알 필요 없음
: 코드를 변경하지 않고 핸들러를 chain에 동적으로 추가하거나 처리 순서를 변경하거나 삭제 가능 (유연성)
단점
: 디버깅하기 어려움
: 요청이 반드시 수행된다는 보장 없음
💡Command 패턴
정의
: 실행될 기능을 클래스로 만들어 캡슐화하는 패턴
장점
: 실행될 기능이 변경되더라도 호출자 클래스를 수정 없이 사용 가능
단점
: 코드 복잡도 증가
💡Interpreter 패턴
정의
: 자주 등장하는 문제를 간단한 언어로 정의하고 재사용하는 패턴
장점
: 언어 쉽게 구현 가능 및 변경, 확장 가능
단점
: 문법 규칙이 많아지면 복잡해짐
💡Iterator 패턴
정의
: Collection 구현 방법을 노출시키지 않으면서 그 안에 들어있는 모든 항목을 순차적인 접근을 지원하는 패턴
장점
: 내부 구조 노출 x
: 순회 알고리즘 코드를 분리할 수 있음 (단일책임원칙)
: 결합도 낮춤
단점
: 복잡도 증가
💡Mediator 패턴
정의
: 캡슐화를 통해 M:N -> M:1 관계로 바꿔 상호작용을 원활하게 하는 패턴
장점
: 효율적인 자원 관리 가능
단점
: Mediator 객체에 권한이 집중화되어 굉장히 크며 복잡해져, 설계 및 Mediator 객체 수정 시 주의
💡Memento 패턴
정의
: 객체를 변경 이전 상태로 복원할 수 있는 패턴
장점
: 캡슐화를 지키면서 상태 객체의 상태 스냅샷 생성 가능
단점
: 객체를 많이 생성할수록 메모리 소비가 큼
💡Observer 패턴
정의
: 객체의 상태가 변할 때 그와 연관된 객체들에게 알림을 보내는 패턴
장점
: 실시간으로 객체의 변경사항을 알릴 수 있음
: 느슨한 결합으로 시스템 유연, 객체 간의 의존성 제거
단점
: 많이 사용하면 상태 관리 힘듦
: 데이터 배분에 문제가 생기면 큰 문제 발생 가능
💡State 패턴
정의
: 상태를 객체화하여 상태에 따라 다르게 행동하도록 위임하는 패턴
장점
: 하나의 객체에 대한 여러 동작을 구현할 때 상태 객체만 수정하므로 동작의 추가, 삭제 및 수정이 간단
: 코드 간결, 가독성 증가 (객체 상태에 따른 조건문이 줄어들기 때문)
단점
: 상태 객체가 증가하여 관리해야 할 클래스 수 증가
💡Strategy 패턴
정의
: 행위를 클래스로 캡슐화하여 동적으로 바꿀 수 있도록 해주는 패턴
장점
: 런타임에 객체 내부에서 사용되는 알고리즘 선택 가능
단점
: 추가적인 클래스 및 인터페이스 필요시 코드 복잡성 증가
: 런타임에 알고리즘 선택하는데 추가적인 오버헤드 발생 가능
💡Template Method 패턴
정의
: 작업의 일부분을 서브 클래스로 캡슐화해서 전체 일을 수행하는 구조는 바꾸지 않고 특정 단계에서 수행하는 내역을 바꾸는 패턴
장점
: 코드의 중복을 줄일 수 있음
: 서브 클래스의 역할을 줄여 핵심 로직 관리가 용이해짐
단점
: 추상 메소드가 많아지면 클래스 생성, 관리가 어려워짐
: 알고리즘 구조 복잡할수록 template method 로직 형태 유지하기 어려움
💡Visitor 패턴
정의
: 방문자와 방문 공간을 분리하여, 방문 공간이 방문자를 맞이할 때, 이후 행동을 방문자에게 위임하는 패턴
장점
: 작업 대상(방문 공간: 데이터 담고 있는 자료구조 만듦)과 작업 항목(방문 공간에서 하는 일) 분리
: 데이터와 알고리즘이 분리되어 데이터 독립성 높여줌
단점
: 새로운 작업 대상(방문 공간)이 추가될 때마다 작업 주체(방문자)도 로직 추가해야 함
: 방문자와 방문 공간의 결합도 증가
'☁️정리 > ❄️CS' 카테고리의 다른 글
[CS] 프로그래밍 패러다임 (0) | 2023.08.23 |
---|---|
[CS] MVC 패턴 (0) | 2023.08.21 |
[CS] 디자인 패턴_구조패턴 (0) | 2023.07.13 |
[CS] 디자인 패턴_생성패턴 (0) | 2023.07.12 |
[CS] 디자인 패턴 (0) | 2023.07.12 |