디자인패턴

OOP/Design Pattern

17. 메멘토(Memento) 패턴

메멘토(Memento) 패턴: 행위패턴 객체의 상태 정보를 저장하고 사용자의 필요에 의하여 원하는 시점의 데이터를 복원 할 수 있는 패턴 특정 시점에서의 객체 내부 상태를 객체화함으로써 이후 요청에 따라 객체를 해당 시점의 상태로 돌릴 수 있는 기능을 제공하는 패턴. 포토샵 되돌리기나 뒤로가기를 떠올리면 이해가 쉬울 것이다. Originator : 현재 상태를 표현하는 State를 가지고 있으며, Memento 객체를 통해 현재 상태를 변경 Memento : Originator의 상태를 나타내는 클래스, Memento를 이용하여 Originator의 상태를 변경 ​CareTaker : Memento를 순서대로 저장하여 관리하는 클래스, Stack이나 List 같은 자료구조를 사용해도 무방 PhotoSha..

OOP/Design Pattern

15. 이터레이터(iterator) 패턴

이터레이터(iterator) 패턴: 행위패턴 컬렉션 구현 방법을 노출시키지 않으면서도 그 집합체안에 들어있는 모든 항목에 접근할 수 있게 해 주는 방법을 제공해 주는 패턴 반복자 패턴이라고도 부른다. 컬렉션 객체 안에 들어있는 모든 항목에 접근하는 방식이 통일되어 있으면 어떤 종류의 집합체에 대해서도 사용할 수 있는 다형적인 코드를 만들수 있다. 반복자 패턴의 본질은 기반이 되는 표현을 노출시키지 않고 연속적으로 객체 요소에 접근하는 방법을 제공하는 것이다. Iterator 집합체의 요소들을 순서대로 검색하기 위한 인터페이스 정의 ConcreateIterator Iterator 인터페이스를 구현함 Aggregate 여러 요소들로 이루어져 있는 집합체 ConcreateAggregate Aggreagate ..

OOP/Design Pattern

14. 인터프리터(Interpreter) 패턴

인터프리터(Interpreter) 패턴 : 행위패턴 문법규칙을 클래스로 표현한 구조, 일련의 규칙으로 정의된 문법적 언어를 해석하는 패턴 해석자 패턴이라고도 불린다. 반복되는 문제 패턴을 언어 또는 문법으로 정의한다. 자바소스 코드를 JVM이 이해할 수 있도록 바이트 코드로 바꿔주는 자바 컴파일러와 정규 표현식이 대표적인 예시이다. Context : Expression에서 사용하는 공통된 정보가 담겨있다. 문장을 저장하고 관리하는 클래스 Expression: 표현하는 문법을 나타낸다. Context가 들어 있는 것을 볼 수 있다. TerminalExpression: 종료되는 Expression NonTerminalExpression: Expression들을 재귀적으로 참조하고 있는 Expression, ..

OOP/Design Pattern

13. 커맨드(Command) 패턴

커맨드(Command) 패턴: 행위패턴 요청에 대한 모든 정보가 포함된 독립실행형 객체로 변환하는 디자인 패턴. 쉽게 말해 Client가 보낸 요청을 객체로 캡슐화한다는 의미이다. 이 변환은 다양한 요청들이 있는 메서드들을 인수화할 수 있도록 하며, 요청의 실행을 지연 또는 대기열에 넣을 수 있도록 하고, 또 실행 취소할 수 있는 작업을 지원할 수 있다. 어떤 객체(A)에서 다른 객체(B)의 메서드를 실행하려면 그 객체(B)를 참조하고 있어야 하는 의존성이 발생한다. 그러나 커맨드 패턴을 적용하면 의존성을 제거할 수 있다. 또한 기능이 수정되거나 변경이 일어날 때 A 클래스 코드를 수정없이 기능에 대한 클래스를 정의하면 되므로 시스템이 확장성이 있으면서 유연해진다. 발송자(Invoker) : 요청들을 시..

OOP/Design Pattern

12. 프록시(Proxy) 패턴

프록시(Proxy) 패턴: 구조패턴 프록시(Proxy)를 번역하면 대리자, 대변인의 의미를 갖고 있다. 대리자, 대변인은 누군가를 대신해서 그 역할을 수행하는 존재이다. 이는 프로그램에도 똑같이 적용된다. 즉, 프록시에게 어떤 일을 대신 시키는 것이다. 일반적으로 프록시는 다른 무언가와 이어지는 인터페이스의 역할을 하는 클래스이다. 프록시는 어떠한 것(이를테면 네트워크 연결, 메모리 안의 커다란 객체, 파일, 또 복제할 수 없거나 수요가 많은 리소스)과도 인터페이스의 역할을 수행할 수 있다. 일반적으로 사용하는 프록시라는 용어와 디자인 패턴에서 말하는 프록시 패턴을 구분해야 한다. 전자는 윗 설명처럼 클라이언트와 사용 대상 사이에 대리 역할을 맡은 오브젝트를 두는 방법을 의미하지만, 후자는 프록시를 사용..

OOP/Design Pattern

11. 플라이웨이트(Flyweight) 패턴

플라이웨이트(Flyweight) 패턴: 구조패턴 동일하거나 유사한 객체들 사이에 가능한 많은 데이터를 서로 공유하여 사용하도록 하여 메모리 사용량을 최소화하는 디자인 패턴이다. 특정 클래스의 인스턴스 한 개만 가지고 여러 개의 가상 인스턴스를 제공하고 싶을 때 사용한다. 쉽게 말해 인스턴스를 가능한 대로 공유하여 메모리 낭비를 줄이는 방법이다. 중요한 점은 중복되는 객체는 공유해서 사용하자는 것! Flyweight 공유에 사용할 클래스들의 인터페이스를 선언 ConcreteFlyweight Flyweight의 구체 클래스 (실제 공유될 객체) FliweightFactory Flyweight 인스턴스를 생성 또는 공유해주는 역할 Client 플라이웨이트틀 사용하는 사용자 Weapon(Flyweight) pa..

OOP/Design Pattern

10. 퍼사드(Facade) 패턴

퍼사드(Facade) 패턴: 구조패턴 하위 시스템을 보다 쉽게 사용할 수 있게 해주는 고급 인터페이스, 클라스나 객체를 조합하여 더 큰 구조를 만드는 패턴 어떤 서브시스템의 일련의 인터페이스에 대한 통합된 인터페이스를 제공한다. 퍼사드에서 고수준 인터페이스를 정의하기 때문에 서브시스템을 더 쉽게 사용할수 있다. 쉽게 생각하면 흩어져 있는 서브 시스템을 통합하여 퍼사드 패턴을 사용해 통합하여 보다 더 쉽게 사용할 수 있음을 의미한다. 간단한 패턴이라 실무에서 은연중에 사용해본 적이 있겠다는 생각이 들었다. 장점: 사용이 간편하고, 유연성이 좋다. 다음 예제는 넷플릭스를 보는 과정을 담았습니다. TV를 전원을 키고, 넷플릭스에 들어가 더글로리 나 피지컬100을 선택하는 과정이죠. 이거 하나하나 메서드를 호출..

OOP/Design Pattern

09. 데코레이터(Decorator) 패턴

데코레이터(Decorator): 구조패턴 어떤 객체에 책임(기능)을 동적으로 추가하는 패턴, 기본 기능을 가지고 있는 클래스를 하나 만들고, 상속과 합성을 이용하여 추가할 수 있는 기능들을 추가하기 편하도록 하는 설계 💡 프록시 란? 클라이언트가 사용하려고 하는 실제 대상인 것처럼 위장해서 클라이언트의 요청을 받아주는 것, 대리자와 대리인 같은 역할을 한다. 타깃과 같은 인터페이스를 구현하며, 프록시가 타깃을 제어할 수 있다. 접근을 제어하거나 부가기능을 추가할 수 있다. 패턴의 이름처럼 객체에 장식을 얹듯 다른 기능까지 추가하는 패턴을 말한다. 여기서 동적으로 추가할 때는 보통 특정 객체를 결합하는 방식을 사용한다. 데코레이터 패턴은 타깃에 부가적인 기능을 런타임 시 다이나믹하게 부여해주기 위해 프록시..

OOP/Design Pattern

08. 컴포지트(Composite) 패턴

컴포지트(Composite) 패턴: 구조패턴 객체들의 관계를 트리 구조로 구성하여 사용자로 하여금 복합 객체와 단일 객체를 구분없이 다룰 수 있도록 하는 패턴 Component - Leaf 클래스와 전체에 해당하는 Composite 클래스에 공통 인터페이스를 정의 Leaf - 부분 클래스 - Composite 객체의 부품으로 설정 Composite - 전체 클래스 - 복수 개의 Leaf, 심지어 복수 개의 Composite 객체를 부분으로 가질 수 있음 정의에 나와있는 대로 객체들의 관계를 위의 내용을 토대로 하여 트리 구조로 만드는 것이 컴포지트 패턴! 대표적으로 폴더구조를 생각하면 이해하기 쉬울 것이다. 장점: 객체들이 모두 같은 타입으로 취급되기 때문에 새로운 클래스 추가가 용이하다. 단일객체, 집..

OOP/Design Pattern

07. 어댑터(Adapter) 패턴

어댑터(Adapter)패턴: 구조패턴 한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 변환한다. 어댑터를 이용하면 인터페이스 호환성 문제 때문에 같이 쓸 수 없는 클래스들을 연결해서 쓸 수 있다. 특정 인터페이스를 지원하지 않는 대상 객체를 인터페이스를 지원하는 Adapter에 집어넣어서 사용하는 방법이라 할 수 있다. 기존 앱에 호환되지 않는 구현 인터페이스를 어댑터처럼 연결해주는 것! Clinet가 Target의 인터페이스를 토대로 사용할 때, Adaptee 구현체를 Target의 작동방식과 동일하게 만들어야 할 것이다. 이때 Adapter을 통해서 동일하게 동작하도록 연결해준다. 이럴 경우 어댑터 패턴을 적용시킬 수 있다! 두 클래스가 동일하거나 유사한 작업을 수행하지만 인..

지구우중
'디자인패턴' 태그의 글 목록