# Head First Design Patterns

15개의 포스트

[6장] Command Pattern

Command Pattern 요청 내역을 객체로 캡슐화해서 객체를 서로 다른 요청 내역에 따라 매개변수화할 수 있다. 요청을 큐에 저장하거나 로그로 기록하거나 작업 취소 기능, 트랜잭션 시스템을 구현할 수 있다. 리모컨 코드 리모컨의 각 슬롯을 클릭했을 때, 명령을 통해 행동을 수행하고 각 슬롯마다 다른 명령을 수행해야 한다. Command Interface 모든 커맨드 객체에서 구현해야 하는 인터페이스이다. execute() 메서드를 생성한다. Command Concrete 행동을 수행할 구상 클래스이다. 리시버 객체를 생성한다. excute 함수가 호출되면 리시버 객체에게 특정 작업을 처리하라는 지시를 전달한다. Receiver Class 어떤 행위를 처리해야 하는지 저장하여 요구 사항을 수행할 때 어떤 일을 처리해야 하는지 알고 있다. Invoker Class 커맨드 객체에게 어떤 행위를

2022년 7월 11일
·
0개의 댓글
·
post-thumbnail

13장 패턴과 함께하는 행복한 삶

학습 목표 디자인 패턴을 정의할 수 있다. 패턴 카탈로그에 대해서 알수 있다. 어떠한 상황에서 이런 패턴을 써야하는 지 알 수 있다. 패턴을 대하는 자세에 대해 알아본다. 다른 영역의 패턴을 알아볼 수 있다. 안티 패턴에 대해 알 수 있다. 디자인 패턴의 정의 패턴 이란 특정 컨텍스트 내에서 주어진 문제 에 대한 해결책 이다. 컨텍스트(context)란 패턴이 적용되는 상황을 뜻합니다. 반복적으로 일어 날 수 있는 상황이어야만 합니다. 문제(problem)란 컨텍스트 내에서 이루고자 하는 목적을 뜻합니다. 또한 컨텍스트 내에서 생길 수 있는 제약조건도 문제에 포함됩니다. 해결책(solution)이 바로 우리가 찾아내야 하는 것입니다. 누구든지 적용해서 일련의 제약조건 내에서 목적을 달성할 수 있는 일반적인 디자인을 뜻합니다. 사실 디자인 패턴이라는 것은 일상적으로, 반복적으로 등장하는 디자인

2021년 12월 10일
·
0개의 댓글
·

Proxy Pattern

프록시 패턴(Proxy Pattern)의 정의 프록시 패턴(Proxy Pattern) - 어떤 객체에 대한 접근을 제어하기 위한 용도로 대리인이나 대변인에 해당하는 객체를 제공하는 패턴 프록시 패턴에서 접근을 제어하는 활용은 아래와 같습니다. 원격 프록시(remote proxy) 프록시 패턴을 써서 원격 객체에 대한 접근을 제어할 수 있습니다. 다른 JVM에 들어있는 객체의 대변인에 해당하는 로컬 객체입니다. 가상 프록시(virtual proxy) 프록시 패턴을 써서 생성하기 힘든 자원에 대한 접근을 제어할 수 있습니다. 실제 객체 생성을 미루게 해 주는 기능을 제공하기도 합니다. 보호 프록시(protection proxy)를 써서 접근 권한이 필요한

2021년 6월 20일
·
0개의 댓글
·

State Pattern

스테이트 패턴(State Pattern) 예제 개선할 샘플 코드 reference code to refactor 위의 예제는 현재 상태에 따라서 수행하는 동작이 달라지는 Gumball Machine을 구현한 것입니다. 각 메소드는 아래와 같이 현재 상태에 따라서 수행하는 동작이 달라지게 됩니다. GumballMachine.java 샘플 코드의 문제점 OCP(Open Closed Principal)을 지키지 않고 있습니다. 객체 지향 디자인이라고 하기 힘듭니다. 상태 전환이 복잡한 조건문 속에 숨어 있기 때문에 분명하게

2021년 6월 19일
·
0개의 댓글
·

Composite Pattern

컴포지트 패턴(Composite Pattern) 디자인 컴포지트 패턴(Composite Pattern)은 객체들을 트리 구조로 구성할 때 쓰는 디자인 패턴입니다. 우선, 객체는 트리 구조와 동일하게 1. Leaf 노드와 2. Leaf 노드가 아닌 Composite 노드가 있습니다. 이 두 객체는 상위 개념인 Component 클래스를 상속받고 재귀적인 구조를 구성합니다. 상위 클래스인 Component 클래스는 이 두 객체에서 구현해야하는 모든 함수를 포함하고 있습니다. Composite 클래스는 자식이 있는 구성요소의 행동을 정의하고 자식 구성요소를 저장하는 역할을 합니다. Leaf 클래스는 그 안에 들어있는 원소에 대한 행동을 정의합니다. 컴포지

2021년 6월 13일
·
0개의 댓글
·

Iterator Pattern

이터레이터 패턴(Iterator Pattern)은 언제 필요할까? code reference 두 개의 구성 객체에서 하나는 정보를 ArrayList 데이터 타입로 가지고 있고 하나는 정보를 Array 데이터 타입으로 가지고 있을 경우, 아래와 같이 각각 다른 loop 를 통해 탐색을 해야합니다. ArrayList - size() 함수 이용 Array - 배열에 들어있는 원소의 크기 변수 이용 Waitress.java HashMap 형태의 다른 데이터 타입이 또 추가된다면 loop 를 돌기 위해 또다른 방식의 처리를 해줘야 합니다. 매번 다른 형태의 데이터타입을 가지고 있는 객체에 대해서 위처럼 처리를 해주는 것을 개선하기 위해

2021년 6월 13일
·
0개의 댓글
·

Adapter Pattern

객체지향 어댑터(Adapter) 어댑터(Adapter)는 클라이언트로부터 요청을 받아서 업체에서 제공하는 클래스에서 받아들일 수 있는 형태의 요청으로 변환시켜주는 중개인 역할을 합니다. 어댑터 패턴(Adapter Pattern) 예시 reference code 레퍼런스 코드를 확인해보면 클라이언트에서 Turkey 를 기존에 제공하는 클래스인 Duck 으로 변환시켜주기 위해 TurkeyAdapter 코드를 추가하였습니다. TurkeyAdapter.java 다이어그램으

2021년 6월 12일
·
0개의 댓글
·

Template Method Pattern

템플릿 메소드 패턴(Template Method Pattern) 예제 code reference 템플릿 메소드(Template Method)에서는 알고리즘의 각 단계들을 정의하며, 그 중 한 개 이상의 단계가 서브클래스에 의해 제공될 수 있습니다. 아래 예시를 살펴보면 CaffeineBeverage 클래스에서 알고리즘을 독점하고 있는 것(prepareRecipe)을 볼 수 있습니다. 그리고 이 알고리즘의 일부 구현만 서브 클래스에 의존합니다. 그래서 알고리즘은 한 군데에 있기 때문에 그 부분만 고치면 됩니다. CaffeineBeverage.java Coffee.java 템플릿 메소드 패턴(Template Method Pattern)의 정

2021년 6월 10일
·
0개의 댓글
·

Facade Pattern

퍼사드 패턴(Facade Pattern)의 정의 퍼사드 패턴(Facade Pattern)은 하나 이상의 복잡한 인터페이스를 깔끔하면서도 말쑥한 퍼사드(겉모양, 외관 등을 뜻함)으로 덮어주는 패턴입니다. 일련의 복잡한 클래스들을 단순화하고 통합된 클래스를 제공합니다. Head First Design Patterns에서는 아래와 같이 퍼사드 패턴을 정의합니다. 퍼사드 패턴(Facade Pattern) 어떤 서브시스템의 일련의 인터페이스에 대한 통합된 인터페이스를 제공합니다. 퍼사드에서 고수준 인터페이스를 정의하기 때문에 서브시스템을 더 쉽게 사용할 수 있습니다. 최소 지식 원칙 Design Pattern 7. 최소 지식 원칙 - 정말 친한 친구하고만 얘기하라.

2021년 6월 10일
·
0개의 댓글
·

Command Pattern

커맨드 패턴(Command Pattern) 예시 커맨드 객체는 일련의 행동을 특정 리시버하고 연결시킴으로써 요구 사항을 캡슐화합니다. 아래 샘플 코드에서 SimpleRemoteControl 은 인보커(Invoker) 클래스, LightOnCommnad 클래스는 커맨드(Command) 클래스, Light 는 리시버(Receiver) 클래스, RemoteControlTest 는 클라이언트(Client) 클래스의 예시입니다. reference code *SimpleR

2021년 6월 6일
·
0개의 댓글
·

Singleton Pattern

싱글톤 패턴(Singleton Pattern)의 용도 스레드 풀, 캐시, 대화상자, 사용자 설정 혹은 레지스트리를 처리하는 객체, 로그 기록용 객체, 디바이스 드라이버 등 객체 중에 하나만 있으면 되는 경우 사용합니다. 고전적인 싱글톤 패턴(Singleton Pattern) 고전적인 싱글톤 패턴 방식은 아래와 같습니다. 생성자는 private 으로 설정하고, 객체를 부를 때에는 따로 static 함수를 사용합니다. 인스턴스가 있을 경우에는 그대로 그 인스턴스를 반환하고, 인스턴스가 없을 경우에는 생성하여 인스턴스를 반환하변 됩니다. 싱글톤 패턴(Singleton Pattern)의 정의 > 싱글톤 패턴 싱글톤 패턴은 해당 클래스의 인스턴스가 하나만 만들어지고, 어디서든지 그 인스턴스에 접근할 수 있도록 하기 위한 패턴입니다. 반드시 생성은 클래스 자신을 통해 하도록 하여, 다른 어떤 클래스에서도 자신의 인스턴스를 추가로 만들지 못하도

2021년 6월 3일
·
0개의 댓글
·

Factory Pattern

흔히 말하는 팩토리 패턴(Factory Pattern)에는 팩토리 메소드 패턴(Factory Method Pattern)과 추상 팩토리 패턴(Abstract Factory Pattern) 두 가지 패턴이 있습니다. 이 패턴들에 대해 오늘 순서대로 알아보겠습니다. 팩토리 패턴(Factory Pattern)의 필요성 new를 사용하는 것은 구상 클래스의 인스턴스를 만드는 것입니다. 구상 클래스를 바탕으로 코딩을 하면 나중에 코드를 수정해야할 가능성이 높아지고, 유연성이 떨어지게 됩니다. 그 예가 아래와 같습니다. code reference 구상 클래스를 사용하면 아래처럼 조건에 따라 만들려고 하는 구상 클래스를 명시해줘야 합니다. 이는 뭔가 변경하

2021년 5월 31일
·
0개의 댓글
·

Decorator Pattern

OCP(Open-Closed Principal) > Design Principal 5. 클래스는 확장에 대해서는 열려 있어야 하지만 코드 변경에 대해서는 닫혀 있어야 한다. 기존 코드는 건드리지 않은 채로 확장을 통해서 새로운 행동을 간단하게 추가할 수 있게 구조를 잡으면 새로운 기능을 아주 유연하게 추가할 수 있으면서도 강하고 견고한 디자인을 만들 수 있습니다. 다만, 무조건 OCP를 적용하는 것은 시간 낭비가 될 수도 있고, 쓸 데 없는 일일 수 있으니 유의하여야 합니다. 데코레이터 패턴(Decorator Pattern)의 정의 데코레이터 패턴은 객체를 다른 객체로 "장식"하는 것입니다. 데코레이터 패턴은 아래와 같이 정의됩니다. > 데코레이터 패턴에서는 객체에 추가적인 요건을 동적으로 첨가한다. 데코레이터는 서브클래스를 만드는 것을 통해서 기능을 유연하게 확장할 수 있는 방법을 제공한다. ![](https://images.velog.io/images/ye-ge

2021년 5월 30일
·
0개의 댓글
·

Observer Pattern

옵저버 패턴(Observer Pattern) 동작 방식 옵저버 패턴(Observer Pattern)에서는 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다(one-to-many) 의존성을 정의합니다. code reference 주제 객체에 옵저버를 옵저버 목록에 추가합니다. 주제 객체의 값이 바뀌면 등록된 옵저버들에게 연락을 합니다. 데이터를 받을 필요가 없는 옵저버들은 옵저버 목록에서 삭제합니다. ![](https://images.velog.io/images/ye-geeee/post/fdb1012e-7070-4ee1-84d0-5742ebd6a2d5/Observe

2021년 5월 28일
·
0개의 댓글
·

Strategy Pattern

패턴 관련 코드는 아래 링크를 통해 확인 가능합니다. sample source code 상속만 사용했을 경우의 단점 상속을 사용하면 코드를 재사용할 수 있지만, 실제 코드를 정비를 하는 데에는 어려움이 있을 수 있습니다. 예를 들어, 자식 클래스에서 부모 클래스와 다른 방식으로 method 로직을 수행해야 한다면 상속을 굳이 사용할 필요가 있을까요? code reference 소프트웨어를 만들 때, 나중에 혹시 고쳐야 할 때도 기존 코드에 미치는 영향은 최소한으로 만들면서 작업할 수 있도록 설계를 해야합니다. 그래서 상속을 사용할 때와 인터페이스를 사용할 때를

2021년 5월 27일
·
0개의 댓글
·