출처: https://typemin.tistory.com/7 [TypeLOG:티스토리]

알고리즘을 객체 구조에서 분리시키는 디자인패턴으로. 이렇게 분리를 하면 구조를 수정하지 않고도 실질적으로 새로운 동작을 기존의 객체 구조에 추가할수 있게 된다. OCP 원칠을 적용하는 방법의 하나이다.

이번에 프로젝트를 하면서 게시판부분에 대해서 작업을 진행했을때 였다.
게시판은 2가지의 분류

  1. sellBoard
  2. storyBoard

로 나뉘었다. 이때 DTO를 만드는 과정에서 두 종류가 가지고있는 필드가 다르기 때문에 DTO의 내용이 달라진다.
sellBoard에는 price라는 필드가 있었는데 이 부분을 꼭 처리를 해줘야하는 상황이다.

해결한 방법을 간단하게 설명하자면 해당 visitor들이 들릴수있는 공간을 만들고, 그 elements들은 visitor를 방문할수있게끔 만들어 주면 됐다.

우선 첫번째 스탭으로 해당 Board 방문을 하는 Element라고 부르겠다. elements들은 visitor를 허용해야한다. 어떤 visitor가 있을지 모르니 interface로 정의한 visitor를 받아주게 하였다.

    // 추상클래스 
    public abstract class Board {
        public abstract BoardDTO accept(BoardVisitor visitor);
    }
    // 구현체
       public class SellBoard extend Board {
        public BoardDTO accept(BoardVisitor visitor){
            visitor.visit(this);
        }
    }

이부분에서 BoardDTO를 반환하게 작성을 하였는데 좋은 방법이 아니다. BoardDTO를 반환할수있는 Visitor만 허용하게 된다. 글을 작성하면서 문제점이 보이니 나중에 꼭 리팩터링을 해야된다.

그리고 나서 elements에 해당하는 visitor들을 만들어준다.

public interface BoardVisitor {
    BoardDTO visit(SellBoard sellBoard);

    BoardDTO visit(StoryBoard storyBoard);
}

이렇게 하면 visitor와 elements에는 준비가 끝났다. 사용하는 곳에서는 내가 만든(앞으로 만들수도 있고) Visitor을 elements.visit()에 인자값으로 넣어주면 된다

    SellBoard sellBoard = new SellBoard(...);
    BoardDTO dto = sellBoard.visit(new ConvertingBoardDTOVisitor());
    // 내가 구현한 convertingclass에 해당 sellboard에 해당하는 메소드가 실행하여 dto반환 

대학교에서 캡스톤디자인 팀플젝을 하면서 우선 시간에 급급하게 프로젝트를 진행했다.
다시 한번 봐보니 이런 부분에서 리팩토링 할 부분에 대해서 생각해보는 시간이 생겼었다.
아직 많기는 하….ㄷ

반응형

'Programming > DesignPattern' 카테고리의 다른 글

추상 팩토리 패턴 VS 팩토리 메소드 패턴  (0) 2023.06.09

+ Recent posts