[디자인 패턴] 인터프리터 패턴

인터프리터 패턴(Interpreter Pattern) 인터프리터 패턴은 간단한 언어의 문법을 정의하고 해석하는 패턴입니다. 데이터를 주고/받을 때 데이터의 패턴(문법)을 객체화하여 언어를 해석합니다. 언어의 패턴을 다루는 예제는 매우 많습니다. 간단한 후휘 표기법 문법을 객체화하여 살펴보겠습니다. 후위 표기법: 1 + 1을 1 1 +와 같은 형태로 작성하는 방법, 연산자가 피연산자들 뒤에 위치합니다. 인터프리터 패턴 구조 인터프리터 패턴이 문장의 어휘를 해석하고 처리하기 위해 다음과 같은 5가지 구성 요소가 필요합니다. Context 문장을 저장하고 관리하는 클래스 Abstract Expression 문장을 해석하기 위한 해석자 인터페이스 클래스 Terminal Expression(Concrete Expression) 문장의 종료를 나타내는 해석자 클래스 구현체 Non-Terminal Expression(Concrete Expression) 문장의 비종료를 나타내는 해석자 클래스 구현체 Client 인터프리터 패턴: Context 클래스 Context 클래스는 문장을 저장하고 관리하는 클래스입니다....

December 17, 2020 · 3 min · Pacientes

[디자인 패턴] 전략 패턴

전략 패턴(Strategy Pattern) 전략 패턴은 객체 내부에서 동적으로 알고리즘을 교체하기 위한 패턴입니다. 여기서 말하는 알고리즘이란 어떤 문제를 해결하기 위한 방법을 의미합니다. 따라서 어떤 문제를 해결하기 위한 함수 또는 로직을 객체로 분리하여 런타임 상황에서 교체하는 패턴입니다. 템플릿 메서드(Template Method)와 유사한 부분이 존재합니다. 템플릿 메서드는 하나의 알고리즘을 다양한 방식으로 재정의(오버라이딩)하여 행동을 분리하는 패턴입니다. 하지만 공통 템플릿도 수정해야할 경우 상위 클래스도 수정해야 하는 단점이 있습니다. 전략 패턴은 템플릿 메서드와는 다르게 행위의 전체를 변경할 때 사용하는 패턴입니다....

December 17, 2020 · 2 min · Pacientes

[디자인 패턴] 템플릿 메서드 패턴

템플릿 메서드 패턴(Template Method Pattern) 템플릿 메서드 패턴은 공통된 기능을 하나로 묶는 간단한 패턴입니다. 즉 중복된 기능과 코드를 공통으로 처리하는 패턴입니다. 템플릿 메서드 패턴 구조 템플릿 메서드는 두 개의 클래스로 구분합니다. 상위 클래스에서 공통된 처리와 로직을 작성합니다. 상위 클래스를 상속하는 하위 클래스는 구성 요소를 재구성하는 작은 코드로 구성됩니다. 템플릿 메서드 패턴: 상위 클래스 샌드위치를 만드는 예제를 생각해보겠습니다. 샌드위치는 내용물이 다르지만 빵 + 내용물 + 빵으로 제작하는 과정은 동일합니다....

December 17, 2020 · 2 min · Pacientes

[디자인 패턴] 메멘토 패턴

메멘토 패턴(Memento) 메멘토 패턴은 객체의 특정한 상태나, 객체 자체를 저장하여 이전 상태로 복구하는 패턴입니다. 메멘토 패턴의 활용 사례는 대부분 프로그램에 적용되어 있습니다. 바로 이전 상태로 복구(Undo)하는 버튼입니다. 무식한 방법으로는 객체의 프로퍼티를 public으로 지정하여 상태를 저장할 수 있습니다. 하지만 이러한 방법은 객체지향의 캡슐화를 파괴하는 끔찍한 방법입니다. 따라서 객체의 캡슐화를 위반하지 않고 객체의 상태를 저장하는 패턴이 메멘토 패턴입니다. 메멘토 패턴의 구조 메멘토 패턴은 객체를 하나 저장하고 반환하는 Memento 클래스가 존재합니다....

December 16, 2020 · 3 min · Pacientes

[디자인 패턴] 상태 패턴

상태 패턴(State Pattern) 어떤 특정 상태에 따라 동작을 분기하기 위해서 조건문(if - else, switch)를 사용합니다. 하지만 상태 패턴은 동작의 분기를 위해 조건문을 사용하지 않고, 객체를 캡슐화하여 독립된 동작으로 구분하는 패턴입니다. 상태 패턴은 상태 표현 객체(Object for State)라고 부르기도 합니다. 상태에 따른 조건 분기: 기본적인 방법 상태에 따라 조건 또는 동작을 분기하는 방법은 아래와 같은 방법을 많이 사용합니다. enum class State { A = 0, B, C, D }; // use if-else condition if (state == State::A) { // do something } else if (state == State::B) { // ....

December 16, 2020 · 3 min · Pacientes