본문 바로가기

Design Pattern22

18. 메멘토 패턴 (memento pattern) 메멘토 패턴 캡슐화를 유지하면서 객체 내부 상태를 외부에 저장하는 방법 --> 객체 상태를 외부에 저장했다가 해당 상태로 다시 복귀할 수 있다. originator : 우리가 저장할 객체이다. 즉 originator의 state를 저장할 것이다. care taker : originator의 내부 정보를 careTaker가 가져와서 저장한다. memento : 내부정보를 추상화한 클래스. careTaker는 originator의 디테일한 정보를 직접적으로 가지는 것이 아니라 memento타입으로 가진다. memento는 imuutable한 객체이어야 한다. 코드로 알아보기 만약 게임을 하는데, 게임을 중지시켰다가 다시 실행해도 중지 전까지의 스코어는 유지되어야 한다. 아주 간단하게 코드로 보면 아래와 같다.. 2021. 12. 28.
17. 중재자 패턴 (Mediator pattern) 중재자 패턴 여러 객체들이 소통하는 방법을 캡슐화하는 패턴 --> 여러 컴포넌트간의 결합도를 중재자를 통해 낮출 수 있다. ex) 비행기들은 관제탑이라는 Mediator를 통해 서로 소통한다. 코드로 알아보기 호텔과 호텔의 여러 서비스들에 대한 코드가 있다고 해보자. main에서 손님(guest)이 타월을 달라고 요청하고, 식사를 하려한다. 그리고 식당(resturant)이 청소를 요청한다. 현재 guest는 resturant과 cleaningService를 aggregate. gym은 cleaningService를 aggregate resturant은 cleaningService를 aggregate ❗️문제점❗️ 각 클래스들을 보면 서로 의존관계를 얽히고 섥히게 가지고 있는 것을 볼 수 있다. 만약 B.. 2021. 12. 27.
16. 이터레이터 패턴 (Iterator pattern) 이터레이터 패턴 집합 객체 내부 구조를 노출시키지 않고 순회하는 방법을 제공하는 패턴. --> 집합 객체를 순회하는 클라이언트 코드를 변경하지 않고 다양한 순회 방법을 제공할 수 있다. 코드로 알아보기 Board는 Post들을 관리하는 객체이다. 클라이언트 코드를 먼저 보자. Board Post ❗️문제점 ❗️ 현재 클라이언트 코드를 보면 board의 post들에 접근하기 위해 board의 Posts가 List타입임을 클라이언트가 알아야한다. 이를 클라이언트가 몰라도 되도록 이터레이터 패턴을 적용하여 수정해보자. 클라이언트에게 Collection이 아닌 Iterator타입을 전달하기 위해서는 자바의 Iterator 인터페이스를 구현하면 된다. 작성일 최신 순인 post iterator를 만들어보자. Re.. 2021. 12. 26.
15. 인터프리터 패턴 (interpreter pattern) 인터프리터 패턴 (CS에서는 사람이 작성한 코드를 하드웨어가 이해할 수 있도록 변환해주는 장치를 인터프리터라고 한다.) 자주 등장하는 문제 🔜 간단한 언어 로 정의하고 재사용하는 패턴 --> 반복되는 문제 패턴을 언어 또는 문법으로 정의하고 확장할 수 있다. ex) 정규표현식 (다이어그램을 보면 컴포짓 패턴과 매우 유사하다.) Context 은 모든 Expression에서 사용하는 공통된 정보가 담겨있다. Expression 은 우리가 표현하는 문법을 나타내는데, Context가 들어 있는 것을 볼 수 있다. TerminalExpression 은 그 자체로 종료되는 Expression이고 Non TerminalExpression 은 다른 Expression들을 재귀적으로 참조하고 있는 Expression.. 2021. 12. 26.