디자인패턴 16

디자인 패턴

프레임 워크와 라이브러리 프레임워크 전체적인 흐름을 제어하고 있으며 개발자는 그 안에서 필요한 코드를 넣어서 사용한다. 좀 더 쉽게 설명하면 원하는 기능 구현에 집중하여 개발할 수 있도록 일정한 형태와 필요한 기능을 갖추고 있는 골격, 뼈대를 의미한다. EX) Spring, Django, Android.. 라이브러리 개발자가 전체적인 흐름을 만들며 사용한다. 소프트웨어를 개발할 때 컴퓨터 프로그램이 사용하는 비휘발성 자원의 모임. 즉, 특정 기능을 모와둔 콛,. 함수들의 집합이며 코드 작성 시 활용 가능한 도구들을 의미한다. EX) JQuery, STL, npm 디자인 패턴 프로그램을 설계할 때 발생했던 문제점들을 객체 간의 상호 관계 등을 이용하여 해결할 수 있도록 하나의 '규약' 형태로 만들어 놓은 ..

디자인패턴 2023.08.02

옵저버 패턴(Observer Pattern)

옵저버 패턴이란? 객체의 상태 변화를 관찰하는 관찰자들 즉, 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴이다. 어떤 객체의 변경 사항이 발생하였을때 이와 연관된 객체들에게 알려주는 디자인 패턴이라고 생각하면 된다. 다수의 객체가 특정 객체 상태 변화를 감지하고 알림을 받는 패턴 발행(publish) - 구독 (subscribe) 패턴을 구현할 수 있다 옵저버 패턴 사용 예제 공지사항을 알리때를 예제로 공지사항을 전파할때(상태변환) 옵저버와 관련된 객체들(유저들)에게 통지하도록 하는 간단한 예제를 옵저버 패턴으로 만들어보도록 하겠다. Observer.class public class Observer { public..

디자인패턴 2022.10.08

메멘토 패턴(Memento Pattern)

메멘토 패턴이란? 객체의 상태 정보를 저장하고 사용자의 필요에 의하여 원하는 시점의 데이터를 복원 할 수 있는 패턴을 말한다. 구조 Originator : 우리가 저장할 객체이다. 즉 originator의 state를 저장할 것이다 Care Taker : originator의 내부 정보를 Care Taker가 가져와서 저장한다 Memento : 내부정보를 추상화한 클래스. Care Taker는 Originator의 디테일한 정보를 직접적으로 가지는 것이 아니라 memento타입으로 가진다. 예제 코드 만약 게임을 하는데. 게임을 중지시켰다가 다시 실행해도 중지 전까지 스코어는 유지되어야 한다. @Getter @Setter public class Game { private int redTeamScore; ..

디자인패턴 2022.10.08

커맨드 패턴 (Command Pattern)

커맨드 패턴 이란? Client가 보낸 요청을 객체로 캡슐화하여 이를 나중에 이용할 수 있도록 필요한 정보를 저장, 로깅, 취소할 수 있게 하는 패턴 요청을 캡슐화 하여 호출자(invoker)와 수신자(reveiver)를 분리하는 패턴이다. - 요청을 처리하는 방법이 바뀌더라도, 호출자의 코드는 변경되지 않는다 구성요소 1. 수신자(Receiver) : 행동을 담당하는 객체 -> 기능을 수행 2. 커맨드(Command) : 수신자의 정보 + 행동이 들어있는 객체 3. 호출자(invoker) : 커맨드를 저장하는 객체 -> 버튼이 어떤 수행을 할 것인지 결정 4. 클라이언트(Client) : 커맨드 객체를 생성하고, 호출자를 통해 수신자에게 할 행동을 결정 예제 코드 1.Button, MyApp 호출자 (..

디자인패턴 2022.10.08

책임 연쇄 패턴(Chain of Responsibility Pattern)

책임 연쇄 패턴이란? 요청을 보내는 쪽(sender)과 요청을 처리하는(receiver) 쪽을 분리하는 패턴이다. 핸들러 체인을 사용해서 요청을 처리한다. 클라이언트로부터의 요청을 처리할 수 있는 처리 객체를 Chain으로 만들어 결합을 느슨하게 하기 위해 만들어진 패턴이다. 일반적으로 요청을 처리할 수 있는 객체를 찾을 때까지 집합 안에서 요청을 전달한다. 예제 코드 public abstract class Handler { public String name; private Handler next; public Handler(String name) { this.name = name; } public void setNext(Handler next) { this.next = next; } public voi..

디자인패턴 2022.10.08

템플릿 메소드 패턴(Template Method Pattern)

템플릿 메소드 패턴이란? 템플릿 메소드 패턴이란 특정 작업을 처리하는 일부분을 서브 클래스로 캡슐화하여 전체적인 구조는 바꾸지 않으면서 특정 단계에서 수행하는 내용을 바꾸는 패턴이다. 디자인 패턴이라고 하기도 뭐할정도로 객체지향 언어로 개발을 하다보면 무의식적으로 사용하는 패턴이다. 주로 개발을 하다보면 구체적인 구현은 다르지만 기본적인 기능은 비슷한 경우가 종종 있다. 예를 들면 HTTP와 SMTP Client 프로그램의 경우, 주고받는 메시지의 내용이 서로 다를 뿐 둘 다 인터넷 프로토콜을 이용하여 서버에게 요청을 전달하고 결과를 수신한다는 점에서 동일하다. 이처럼 두개 이상의 프로그램이 기본적으로 동일한 골격 하에서 동작할때 기본 골격에 해당하는 알고리즘은 일괄적으로 관리하면서 각 프로그램마다 달라..

디자인패턴 2022.09.25

전략패턴(Strategy Pattern)

전략 패턴 ( Strategy Pattern ) 객체들이 할 수 있는 행위 각각에 대해 전략 클래스를 생성하고, 유사한 행위들을 캡슐화 하는 인터페이스를 정의하여, 객체의 행위를 동적으로 바꾸고 싶은 경우 직접 행위를 수정하지 않고 전략을 바꿔주기만 함으로써 행위를 유연하게 확장하는 방법을 말합니다. 간단히 말해서 객체가 할 수 있는 행위들 각각을 전략으로 만들어 놓고, 동적으로 행위의 수정이 필요한 경우 전략을 바꾸는 것만으로 행위의 수정이 가능하도록 만든 패턴입니다. Strategy: 인터페이스나 추상 클래스로 외부에서 동일한 방식으로 알고리즘을 호출하는 방법을 명시 ConcreateStrategy1, 2, 3: 스트래티지 패턴에서 명시한 알고리즘을 실제로 구현한 클래스 Context: 스트래티지 패..

디자인패턴 2022.09.20

플라이웨이턴 패턴 (Flyweight Pattern)

플라이웨이턴 패턴 (Flyweight Pattern) 란? 여러 클래스의 인스턴스 한 개만 가지고 여러 개의 "가상 인스턴스"를 제공하고 싶을 때 사용하는 패턴이다. 인스턴스를 가능한 대로 공유시켜 슬데없이 new 연산자를 통한 메모리 낭비를 줄이는 방식이다. 자주 변하는 속성(외적인 속성, extrinsit)과 변하지 않는 속성(내적인 속성, intrinsit)을 분리하고 재사용하여 메모리 사용을 줄인다 Character 클래스 글자 하나를 표현한 도메인 public class Character { private char value; private String color; private String fontFamily; private int fontSize; public Character(char va..

디자인패턴 2022.08.15

퍼사드 패턴(Facade Pattern)

퍼사드 패턴(Facade Pattern) 이란? 퍼사드 패턴(Facade Pattern)은 구조 패턴(Structural Pattern)의 한 종류로, 서브시스템들의 공통적인 기능을 정의하는 단순화된상위 수준의 인터페이스를 정의하는 패턴이다. 복잡한 서브 시스템 의존성을 최소화하는 방법 클라이언트가 사용해야 하는 복잡한 서브 시스템 의존성을 간단한 인터페이스로 추상화 할수 있다. 이메일 발송로직을 예로 들어봅시다. 퍼사드 패턴 사용 전 public class Client { public static void main(String[] args) { String to = "namookk@test.com"; String from = "namookk2@test.com"; String host = "127.0.0..

디자인패턴 2022.08.14

데코레이터(Decorator) 패턴

데코레이터 패턴 (Decorator Pattern) 이란? 기존에 있는 코드를 변경하지 않고 부가적인 기능을 추가하는 패턴이다. 데코레이터 사용 전 Comment 를 관리하는 CommentService 는 아래와 같으며 addComment 는 Comment 를 출력하는 메서드이다. public class CommentService { public void addComment(String comment) { System.out.println(comment); } } SpamFiltering 은 http 프로토콜을 받기 싫다면 그에 맞는 기능을 추가해야한다. 해당 기능은 아래와 같이 SpamFilteringCommentService로 구현할 수 있다 public class SpamFilteringCommen..

디자인패턴 2022.08.04