본문 바로가기

Design Pattern22

22. 비지터 패턴 (visitor pattern) 비지터 패턴 기존 코드를 변경하지 않고 새로운 기능을 추가하는 방법 --> 더블 디스패치(Double Dispatch)를 활용할 수 있다. 특정 클래스에 SRP를 지키고 싶어 더는 책임을 늘리고 싶지 않다거나, 버그가 발생할 수 있으니 더 이상 코드를 작성하고 싶지 않을 때, 또는 해당 코드는 다른 곳에도 사용될 수 있을 거 같은데? 라는 생각을 한다면 해당 패턴을 적용할 수 있다. 코드로 알아보기 특정 디바이스에 도형을 그려야한다고 해보자. 디바이스 클래스를 각 구체적인 디바이스(phone, watch)들이 상속하고, Shape 인터페이스를 도형들이 implements한다. Device 클래스와 그것을 구현한 각 디바이스들은 모두 비어있는 클래스다. Shape 인터페이스 각 도형들은 printTo의 인.. 2022. 1. 2.
21. 템플릿 메서드 패턴 ( template pattern) 템플릿 메서드 패턴 알고리즘 구조를 서브 클래스가 확장할 수 있도록 템플릿으로 제공하는 방법. --> 추상 클래스는 템플릿을 제공하고 하위 클래스는 구체적인 알고리즘을 사용한다. 알고리즘의 구조(예:1.파일을 읽은 뒤, 2.적절히 파싱한뒤, 3.출력한다.)를 템플릿으로 제공한다. 그리고 각각의 1, 2, 3들 중 달라질 수 있는 부분이 있다면 서브 클래스는 요 달라지는 부분만 직접 구현한다. AbstractClass의 templateMethod()는 알고리즘의 구조를 표현하는 메소드이다. 코드로 알아보기 간단하게 숫자로만 이루어진 txt파일을 읽어서 해당 파일의 숫자들을 모두 덧셈한 결과를 알려주는 기능이 있다고 해보자. numbers.txt 텍스트 파일은 아래와 같고 1 2 3 4 5 Client 코드.. 2022. 1. 1.
20. 전략 패턴 (strategy pattern) 전략 패턴 여러 알고리즘들을 캡슐화하고 상호 교환 가능하게 만드는 패턴 --> 컨텍스트에서 사용할 알고리즘들을 클라이언트에서 선택한다. 즉 특정 업무을 수행하는 방법이 여러가지 일 때, 여러가지 방법들을 각각의 클래스로 캡슐화하면, 캡술화된 것을 공통된 인터페이스로 추상화하여 업무를 수행하는 Client에서는 요 인터페이스를 사용하게 하여 Client의 코드는 변경되지 않아도, 여러 방법들을 바꿔 낄 수 있도록 한다. (예 : 자바의 Comparator) Context : 원래의 로직을 수행하던 클래스 ConcreteStrategy : 각각의 알고리즘들이 구현된 클래스 Strategy : 추상화된 알고리즘 수행 인터페이스 코드로 알아보기 '무궁화꽃이 피었습니다'를 하는 코드가 있다고 하자. "무궁화 꽃이.. 2021. 12. 31.
19. 상태 패턴 ( state pattern) 상태 패턴 객체 내부 상태 변경에 따라 객체의 행동이 달라지는 패턴 --> 상태에 특화된 행동들을 분리해 낼 수 있으며, 새로운 행동을 추가하더라도 다른 행동에 영향을 주지 않는다. 예로 티비가 켜져있다면 음량버튼을 누르면 음량이 증가하거나 감소한다. 하지만 전원버튼을 눌러 티비를 끈다면 음량버튼을 아무리 눌러도 티비의 음량은 바뀌지 않는다. 즉 티비전원이 눌렸나? 안눌렸나? 라는 리모컨의 상태에 따라 행동이 바뀌는 것이다. 코드로 알아보기 온라인강의가 있고, 이것을 학생들이 수강할 수 있다고 하자. 온라인강의에 학생을 추가하거나, 리뷰를 달 수 있는데, 이때 온라인 강의의 상태에 따라 학생 추가와 리뷰 달기가 다르게 작동한다. 먼저 클라이언트 코드를 보자. OnlineCourse는 아래와 같다. Onl.. 2021. 12. 31.