공부/디자인 패턴
-
[Design Pattern] 방문자 패턴 (Visitor Pattern)공부/디자인 패턴 2021. 7. 25. 17:30
방문자 패턴은 방문자와 방문 공간을 분리하여 방문 공간이 방문자를 맞이할 때, 이후에 대한 행동을 방문자에게 위임하는 패턴입니다. 비슷한 객체에서 어떤 동작을 해야할 때 방문자 패턴을 사용하면 수행 로직을 분리할 수 있습니다. 즉, 데이터 구조와 연산을 분리하여 구조를 변경하지 않고 새로운 연산을 추가할 수 있습니다. 새로운 연산을 추가하고 싶으면 새로운 방문자를 추가하면 되는 형식입니다. 클래스 다이어그램 Visitor: Eliment를 방문하고 동작을 구현하기 위한 인터페이스 ConcreteVisitor1, 2: Visitor를 상속받아 실제 동작을 구현한 클래스 Element: visitor가 방문하여 수행해야 하는 대상. 구조를 구성하는 인터페이스 ConcreteElementA, B: Elemen..
-
[Design Pattern] 전략 패턴 (Strategy Pattern)공부/디자인 패턴 2021. 7. 24. 20:52
전략 패턴이란 각각의 알고리즘을 교환이 가능하도록 정의, 캡슐화를 한 다음, 서로 교환해서 사용할 수 있는 패턴입니다. 즉, 객체들이 할 수 있는 동작을 각각의 전략으로 만들어 놓고 동적으로 동작을 변경해야 한다면 전략만 변경하여 동작이 바뀌도록 하는 패턴입니다. 이러한 패턴을 사용하면 OCP에 위배되지 않고 시스템이 거대해졌을 때, 메소드의 중복을 해결할 수 있습니다. 클래스 다이어그램 Context: Strategy의 메소드를 호출해서 사용하는 클래스 Strategy: 전략을 사용하기 위한 인터페이스 ConcreteStrategyA, B, C: Strategy 인터페이스를 실제 구현하는 클래스 예시 먼저 아래와 같이 사람과 오리를 나타내는 인터페이스와 클래스가 있다고 합니다. cry 메소드를 호출하면..
-
[Design Pattern] 스테이트 패턴 (State Pattern)공부/디자인 패턴 2021. 7. 18. 17:14
스테이트 패턴은 상태를 관리하는데 도움을 주는 디자인 패턴입니다. 어떤 행동을 수행할 때, 상태에 맞는 행동을 수행하도록 처리하도록 합니다. 이러한 시스템을 클래스로 분리하고 각 클래스에서 행동에 맞는 수행동작을 구현합니다. 자바의 경우, 캡슐화를 위해 인터페이스를 생성해 시스템의 각 상태를 나타내는 클래스로 구현합니다. 예를 들어, 자판기에서 동전 있음, 동전 없음, 상품 품절, 상품 반환 과 같은 상태를 조건문으로 분기하여 처리하는 것이 아닌 각 상태를 클래스에 캡슐화하여 구현하는 방식입니다. 클래스 다이어그램 State: 시스템의 모든 상태를 제공하는 인터페이스. Context: state를 이용하여 역할을 수행하는 클래스. 현재 시스템의 상태를 나타내는 상태 변수(state)와 실제 시스템의 상태..
-
[Design Pattern] 메멘토 패턴 (Memento Pattern)공부/디자인 패턴 2021. 7. 17. 21:11
메멘토 패턴이란 객체의 정보를 저장하고 사용자가 원하는 시점의 데이터를 복원할 수 있도록 하는 패턴입니다. 클래스 다이어그램 Originator: 현재 상태를 저장하고 Memento 객체의 정보를 얻는 클래스 Memento: 상태를 갖고 있는 클래스 Caretaker: Memento 클래스를 순서대로 저장하는 클래스 예제 public class Memento { private final String state; public Memento(String state){ this.state = state; } public String getState(){ return state; } } public class Originator { private String state; public void setState(S..
-
[Design Pattern] 중재자 패턴 (Mediator Pattern)공부/디자인 패턴 2021. 7. 11. 17:00
중재자 패턴은 클래스 간의 복잡한 관계들을 캡슐화하여 하나의 클래스에서 관리하도록 처리하는 패턴입니다. M:N 관계를 해당 패턴을 사용하면 M:1 관계로 만들어 복잡도를 내리므로 유지 보수 및 확장성에 유리합니다. M개의 객체들 사이에 중재자를 추가하여 중재자가 모든 객체들의 통신을 담당하도록 변경하면 중재자 패턴이라 볼 수 있습니다. 이와 같이 진행하면 각 객체들은 서로 알 필요가 없고 중재자 클래스가 관리하므로 느슨한 결합(loose coupling)을 유지할 수 있고 전체적인 흐름을 읽기 편해집니다. 단점으로는 특정 application에 맞춰져서 개발이 되기 때문에 재사용이 어렵습니다. 이와 유사한 패턴으로는 퍼사드 패턴(https://brownbears.tistory.com/507)과 옵저버 패..
-
[Design Pattern] 이터레이터 패턴 (Iterator Pattern)공부/디자인 패턴 2021. 6. 20. 20:18
이터레이터 패턴은 컬렉션의 구현 방법을 노출시키지 않고 그 안에 존재하는 모든 항목에 접근할 수 있도록 하는 패턴입니다. 이터레이터 패턴을 사용하면 컬렉션 내에 구현이 어떤지 몰라도 해당 객체에 접근해 반복 작업을 처리할 수 있습니다. for (int i = 0; i < arr.length < i++) { System.out.println(arr[i]); } 위에서 i는 arr이라는 배열의 위치를 나타내는 변수입니다. 이러한 기능을 추상화하여 일반화 한 것을 이터레이터 패턴이라 합니다. 클래스 다이어그램 iterator: 컬렉션의 요소들을 순서대로 검색하기 위한 인터페이스 ConcreteInterface: iterator 인터페이스 구현체 Aggregate: 여러 요소들로 구성된 컬렉션 인터페이스 Con..
-
[Design Pattern] 커맨드 패턴 (Command Pattern)공부/디자인 패턴 2021. 6. 12. 19:02
커맨드 패턴은 특정 객체에 대한 커맨드를 객체화 하여 커맨드 객체를 필요에 따라 처리하는 패턴입니다. 보통 주체 객체 → 대상 객체 와 같은 방식으로 호출한다면 대상 객체에 대한 액션은 주체 객체에서 메소드로 처리하는데 이 액션을 객체로 만들어 처리하는 방식입니다. 실행될 기능을 캡슐화함으로써 여러 기능을 실행할 수 있어 재사용성이 높습니다. 또한 기능이 수정되거나 변경이 일어났을 때, 주체 객체의 코드 수정 없이 기능에 대한 클래스만 정의하면 되어 확장성이 유연해집니다. 클래스 다이어그램 Invoker: 기능의 실행을 요청하는 호출자 클래스. Client의 요청을 받아 Receiver의 액션을 호출. Command: 실행될 기능에 대한 인터페이스. 실행될 기능을 execute()로 정의 Concrete..
-
[Design Pattern] 템플릿 메소드 패턴 (Template Method Pattern)공부/디자인 패턴 2021. 6. 6. 18:13
템플릿 메소드 패턴이란 여러 클래스에서 공통적으로 호출, 사용하는 메소드들을 상위 클래스에서 정의하고 이 상위 클래스를 상속 받은 하위 클래스에서 세부 동작을 구현하는 패턴을 말합니다. 이는 객체 지향 언어로 개발할 때, 해당 패턴을 알지 못해도 많이 사용하고 접하는 패턴입니다. 템플릿 메소드 패턴을 사용하면 중복 코드를 제거할 수 있고 상속을 받은 하위 클래스의 역할이 줄어 로직 관리가 편합니다. 하지만 추상 메소드가 많아진다면 클래스의 관리가 복잡해 진다는 단점이 있습니다. 클래스 다이어그램 예제 예를 들어, 아래와 같이 공항에 도착해 티켓을 발권받는 과정을 코딩한다면 아래와 같습니다. public class IncheonAirport { public void check() { checkPasspor..
-
[Design Pattern] 데코레이터 패턴(Decorator Pattern)공부/디자인 패턴 2021. 5. 31. 21:37
데코레이터 패턴이란 어떤 객체에 상황과 용도에 따라 새로운 책임을 추가하는 형식입니다. 객체에 기능을 동적으로 추가하여 서브 클래스를 생성하는 것보다 유연하게 기능을 확장할 수 있습니다. 클래스 다이어그램 Component: ConcreateComponent와 Decorator를 위한 인터페이스. ConcreteComponent: 기능 추가를 받을 기본 객체 Decorator: 기능 추가를 할 객체를 위한 추상 클래스 ConcreteDecorator: Decorator를 상속받아 구현할 객체. ConcreteComponent에 추가하기 위해 생성 예제 카페를 차려서 커피를 팔게 되어 아래와 같이 메뉴를 구성했습니다. public interface Beverage { int getCost(); String..
-
[Design Pattern] 옵저버 패턴 (Observer Pattern)공부/디자인 패턴 2021. 5. 22. 22:44
옵저버 패턴이란 한 객체의 상태가 변경이 되면 해당 객체를 의존하고 있는 모든 객체에게 의존하고 있는 객체의 상태가 변경되었다고 알려주는 디자인 패턴입니다. 여기서 상태가 변경되었는지 관찰 대상 객체를 subject라 하고 이러한 변경을 관찰하는 객체를 observer라 합니다. 즉, observer 객체들은 subject에 의존성을 갖습니다. subject 객체를 관찰하여 변경을 감지하고자 하는 객체를 observer로 등록하고 변경이 되었을 때, 이를 탐지할 수 있습니다. 이해하기 쉬운 예제를 들면, 유튜브를 생각하면 됩니다. a라는 유튜브 채널(subject)을 A, B, C 라는 사람이 구독을 하게 되면(observer) 해당 채널에 새로운 영상이나 글이 올라올 경우(객체의 상태 변경), 해당 유..