[Design Pattern] 상태 패턴 (State Pattern)
·
Design Pattern
1. 상태 패턴상태 패턴은 상태가 하나의 클래스가 되어해당 상태일 때 각 동작들을 어떻게 처리할지 정의하고다른 클래스는 상태에 의존하여 각 행동(격발, 스왑, 재장전)의 역할을 위임하는 패턴을 의미한다. 2. 상태 패턴은 언제 사용될까?switch(CurrentState){ case Idle: // ... case Attacking: // ... case Reloading: // ... case Stunned: // ... case Rolling: // ... case Aiming: // ...}위는 상태 분기 방식의 코드이다.상태가 적을 경우 코드가 간단하여 빠르게 구현 가능하며디버깅 시 상태별 분기가 한 곳에 모여 있어 추적하기 쉽다. 그러나 상태가 많아질수록 swit..
[Design Pattern] 옵저버 패턴
·
Design Pattern
1. 옵저버 패턴옵저버 패턴은 어떤 객체의 상태가 변할 때이를 감시하는 다른 객체들에게 알려주는 패턴을 말한다. 2. 옵저버 패턴 구조IObserver옵저버 인터페이스Subject에서 이벤트 변경시 호출될 함수(Update)를 가지고 있다.ObserverA, B옵저버 인터페이스를 구현한 클래스이다.ISubject옵저버를 관리하는 인터페이스옵저버를 등록, 삭제, 알림 기능을 함수로 가지고 있다.ConcreteSubjectISubject를 구현한 클래스이다.옵저버들을 특정 자료구조로 포함하고 있다. (컴포지션 관계) 3. 옵저버 패턴 흐름옵저버 관리 객체를 생성한다. (ISubject)옵저버를 생성한다. (Observer)ISubject에 Observer 객체를 등록한다.ISubject에서 이벤트가 발생한다..
[Design Pattern] 커맨드 패턴 (Command Pattern)
·
Design Pattern
1. 커맨드 패턴커맨드 패턴은 명령을 추상화해서 객체로 다루는 것을 말한다.명령을 객체로 다루게 되면 이를 소유한 객체는 명령을 실행할 수 있다.명령을 객체로 다루게 되면 큐에 명령들을 담아 원할 때 꺼내 명령을 실행할 수 있다. 2. 커맨드 패턴은 언제 사용할까?게임에서 캐릭터를 선택할 때마우스 클릭과 키보드 엔터로 캐릭터를 선택할 수 있다. 서로 다른 상호작용이 동일한 기능을 수행해야할 때하나의 커맨드 객체를 소유하여 이를 실행함으로써 코드를 재사용할 수 있도록 처리할 수 있다. 3. 커맨드 패턴 구조Invoker : 커맨드를 저장하고 실행하는 객체이다.Command : 커맨드 인터페이스Command1 : 커맨드 인터페이스를 상속받은 커맨드 클래스이다. 실행할 로직을 구현한다.Receiver : 커..
[Design Pattern] 퍼사드 패턴 (Facade)
·
Design Pattern
1. 퍼사드 패턴퍼사드 패턴은클라이언트가 여러 객체를 참조하여 기능을 처리하는 것이 아닌하나의 객체를 참조하여(퍼사드 객체) 기능을 처리하는 패턴을 의미힌다. 2. 퍼사드 패턴 필요한 이유클라이언트가 외출 시 여러 가지 작업을 해야한다고 가정해보자.가스밸브 잠금 확인전등/조명 꺼짐 확인에어컨/난방기 꺼짐 확인창문 닫힘 확인클라이언트는 여러 객체를 참조하여 이를 Check, Check, Check 하는 것이 아닌외출시 (LeaveHome) 이 모든 것을 확인해주는 스마트 홈 시스템 객체(퍼사드 객체)를 하나 만들고클라이언트는 하나의 객체를 참조하여 한 번의 호출로 모든 작업을 처리하도록 구현한다. 클라이언트는 여러 객체의 세부 함수들을 알지 않아도 되며퍼사드 객체를 통해 필요한 기능들을 모두 수행할 수 있..
[Design Pattern] 프록시 패턴 (Proxy Pattern)
·
Design Pattern
1. 프록시 패턴어떤 객체에 대한 접근 제어를 프록시 객체를 만들어 위임하는 패턴을 말한다. 프록시 객체는 원본 객체를 호출 전새로운 기능(동작, 접근 제어, 로깅, 캐싱)을 추가로 수행한다. 클라이언트는 프록시 객체를 원본처럼 사용한다. 2. 프록시 패턴 예시원본 객체에 "관리자 권한"이 필요한 경우프록시 객체를 만든 뒤 원본 객체와 컴포지션 관계를 만들고관리자 권한 기능(인증, 권한 확인)을 작성하여 원본 객체를 호출하기 전 처리될 수 있도록 구현한다.#include #include #include // 인터페이스 (Subject)class IAdminService{public: virtual void PerformSensitiveOperation() = 0; virtual ~IAdminS..
[Design Pattern] 어댑터 패턴 (Adapter Pattern)
·
Design Pattern
1. 어댑터 패턴어댑터 패턴은기존 시스템에서 새로운 라이브러리를 추가할 때호환될 수 있도록 중간 레이어 클래스를 만드는 작업을 말한다. 2. 어댑터 패턴 예제상황 1SortingMachine 클래스는 ISortEngine 인터페이스를 의존하여 A_SortEngine을 사용해 왔다.그러다 성능 문제로 인하여 타 회사(B)의 엔진으로 교체 결정을 하게 되었다. 상황 2타 회사(B)로부터 전달받은 B_SortEngine을 가져왔으나 기존 코드와 호환되지 않았다.기존 코드에서 작동되도록 B_SortEngine 코드를 수정해볼까 생각하였으나 이는 원본 코드를 훼손할 뿐더러 어느 정도의 시간이 걸릴지 예측할 수 없었다. 해결 방안기존의 코드에서 사용하는 ISortEngine 인터페이스를 구현한 중간 클래스를 만든다..
[Design Pattern] 팩토리 패턴 (Factory Pattern)
·
Design Pattern
1. 팩토리 패턴팩토리 패턴은 객체 생성 로직을 팩토리(인터페이스)로 캡슐화하여클라이언트 코드가 특정 구채 클래스에 직접 의존하지 않도록 하는 생성 디자인 패턴을 가리킨다. 2. 팩토리 패턴은 언제 사용할까?// 원본 코드Document doc = new WordDocument();// 수정할 코드Document doc = new PDFDocument();새로운 제품 클래스가 추가되어 기존 코드를 수정하고자 한다.프로젝트 모든 코드에서 WordDocument 클래스 대신 PDFDocument 클래스를 사용하고자 한다면일일이 찾아 관련 코드를 변경해줘야 한다. 기존 코드를 SOLID 원칙으로 바라본다면개방 폐쇄 원칙 - OCP (기존 코드를 수정하지 않고 확장이 가능해야 한다.)의존성 역전 원칙 - DIP..
[Design Pattern] 반복자 패턴 (Iterator Pattern)
·
Design Pattern
1. 반복자 패턴 (Iterator Pattern)리스트, 스택, 트리, 그래프 등을 컬렉션(Collection)이라고 한다.반복자 패턴은 컬렉션을 외부에 노출하지 않고, 컬렉션의 요소들을 하나씩 순회할 수 있도록 하는 행동 디자인 패턴이다.  2. 문제 상황 (Why Iterator?)컬렉션마다 순회하는 로직이 다를 수 있다.로직에서 컬렉션을 변경할 때 순회하는 로직이 다르기에 코드가 함께 수정되어야 한다. 3. 해결 방안반복자 패턴을 사용하여컬렉션 종류에 상관없이 순회 가능한 로직을 외부에 제공한다. 4. 반복자 패턴 클래스 구조반복자 인터페이스 (IIterator)외부에 호출될 함수를 정리한다.순회를 하기 위해 HasNext() 다음 값이 있는지, Next() 다음 값으로 이동하는 함수를 가상함수로..