PATTERN 패턴 배우는 순서 정리
패턴들을 배우는 순서
📜 제목으로 보기
패턴을 배우는 순서
- 패턴을 배우는 순서
-
좋은 상속의 Templatemethod 패턴
-
좋은상속이라도 조합폭발방지 -> strategy패턴
- 전략패턴의 전략패턴 -> adapter 패턴
- 전략객체가 많이 나오다보면, 단일요소 객체 vs 컬렉션 객체를 포괄하는Composite패턴
- element vs collection -> 컴포짓 패턴
-
Composite객체의 출력을 위한 구상class 속 loop등의 제어문들을 타는 객체를 따로 외부에 위임 -> Visitor패턴
-
제어문을 타야 자신의 데이터를 다 뿌릴 수 있는 객체(Composite객체)가 있다고 치자
-
제어문을 가진 체 출력하는 Renderer클래스가 있다
-
제어문의 안에 내용만 바뀐다면 [종류별 XXXXRenderer클래스들]을 여러개 만드는 대신 제어문을 역전하여 유지만 하고,
제어문 안의 내용은 Visitor를 주입해서 끼워넣은 다음, 전략패턴으로서 종류별 XXXXVisitor를 만들어서 끼워넣자
-
제어문은 전략패턴으로 못만든다.
제어문 속에서 라이프싸이클별 작동하는 로직을 전략패턴
으로 뺀 다음 Visitor로 이름 붙인다.
-
-
이제 제어문 속 라이프싸이클을 타는 visitor별로
실제 제어대상 객체(Composite객체)
를 제어역전된 클래스(Renderer의 메서드 인자 -> Visitor의 메서드인자(역할위임)을 통해 Visitor에게 전달한다
-
-
visitor를 주입받는 구상클래스(Renderer) 자체가 제어의역전 클래스임. Visitor객체 는 제어역전된 속에서 제어문만 탄다
-
실제 컴포짓객체 속 데이터를 반환해주는 것은, Visitor의 역할책임으로 위임
- 데이터자체는 Composite객체가 VIsitor의 역할/책임 메서드의 파라미터로 들어가서 사용됨
-
-
element간에 연결 by linkedlist -> 데코레이터 패턴
-
중간에 멈출 수 없는 한번에 쭉 가는 for문을 써야한다는 문제점 -> 책임사슬 패턴
- 나머지들 -> 끝판왕 커맨드 패턴
- Visitor주입으로 인한
제어의역전
이후에행위도 캡슐화한 뒤 역전
하는 Command패턴 -
이미 존재하는 composite
객체를 소유한 Command홀더 객체
내에서 만들어간다- 지연실행에 대한 일이라 어렵다
- 해야하는 일을 함수에 담아서 -> 객체로 만들고 -> 모았다가 -> 실행or역카운터실행
-
제어에 참여하는 객체(Visitor가 파라미터로 위임받은 객체)를 소유한 커맨드홀더객체
를 만들고1개의 메서드(with 서비스메서드들) + 여러 구상커맨드객체들
로 런타임에서 행위를 조작할 수 있는범용객체
가 된다.- Visitor에 위임하는 객체를, 커맨드홀더가 소유함으로써
커맨드객체를 통한 행위조작으로 의존성없는 안전한 범용객체
가 Visitor에게 역할 위임하게 되어Visitor도 안전
해진다. - 행위를 추가하려면, 커맨드객체 추가해서 처리하면 되니까??
- Visitor에 위임하는 객체를, 커맨드홀더가 소유함으로써
-
커맨드홀더객체는, 범용객체로서, runtime에
행위위임 커맨드객체
를 교체해서 갈아낄 수 있게 된다.- xml에는 string으로 -> 주입돌 커맨드들을 설정하는 것이고, 스프링빈즈가 runtime에 조립한다.
- @autowired애노테이션 -> 범용객체 생성 후, @달린 것들을 끼워넣어서 돌아가게 한다.
- 커맨드홀더객체 == 커맨드invoker == 범용객체 == composite라면 root객체를 소유한 객체?!
- Visitor주입으로 인한
-
저장하고 로드하려면 -> 메멘토 패턴
-
메멘토패턴은 visitor패턴을 통해 쉽게 구현할 수 있다.
-
구상 visitor 중 1개(JsonVisitor)가 라이프싸이클을 타면서 처리된 내용을 매번 객체context인 필드에 저장해놓는다.
- 이 때, 이미 외부에서 생성된 Visitor를 주입해야한다
- 다른 Visitor는 내부 지연생성도 할 수 있도록 주입대상인 Renderer는 factory 함수형인터페이스를 생성자로 받는다.
-
save를 구현하는 곳에서는 상태값에 데이터정보를 저장한 상태이므로 getter로 제공받아 저장한다.
-
- 메멘토패턴은 Visitor패턴계열이다.
- 일단 Composite패턴 -> 출력을 위한 Visitor패턴을 구현할 줄 알아야 구현된다.
- 참고로 Command패턴은 다른 동네이다
- bridge, adapter, command패턴이 한 동네이다.
- 행위를 포장하는 것이 더 큰 동네이고 힘들다
-
@Transactional을 하려면, 메멘토패턴으로 상태를 저장해야한다.
- undo/redo를 할 수 있다. 트랜잭션으로서 롤백을 할 수 있다.
- 내가 만든 메소드도 롤백할 수 있게 된다.
-
-
동네 구분
- Visitor계열: strategy -> composite + visitor -> 전체의 40%
- command계열: bridge, adapter 등 -> 나머지 전부
- composite + visitor가 자유로우면 중급개발자이다.
-
- 1패턴 -> 1객체가 아니라 1객체가 여러가지 패턴을 소유할 수 있음.
- 분산되어있는 컴포짓패턴 -> 다음장에 바로 컴포짓패턴의 3가지 역할을 다 수행하는 컴포짓패턴을 소개함.
- 디자인패턴의 다이어그램은, 객체의 역할이지 객체가 아니다.
- 다이어그램 갯수만큼 객체가 나오지 않는다.
- 역할별로 1개의 객체로 연습
- 이후 모든 역할을 1개의 객체에 몰빵하는 연습
- 전략객체이자 실행객체
- 전략객체이자 상태객체
- 전략객체 소유하는 객체를 상태객체로 만들기