메인 프로젝트를 진행하며 좋아요 기능을 개발할 때 중첩 if문을 사용하여 이와 같이 개발했었다.
if 좋아요를 눌렀던 기록이 존재한다면
if 기록의 상태가 좋아요일때
else if 기록의 상태가 좋아요를 취소했을때
else if 좋아요를 누른 기록이 존재하지 않을 때
이를 보신 멘토님께서 디자인 패턴의 State Pattern과 Strategy Pattern을 공부해보면 어떻겠냐며 권유를 해주셨고 이전에도 디자인 패턴에 대해 궁금증이 많았기에 이번 기회에 해보려고 한다.
Strategy Pattern은 이후 블로깅 할 예정이다.
리팩토링 이전 좋아요 코드
public Likes likesContents() {
...
if (좋아요 기록이 없을때) {
reLikesClick();
// 기록이 있을때
} else {
likesClick();
}
}
/*좋아요를 누른 이력이 있는 경우*/
private void reLikesClick() {
if (좋아요 상태가 true이면) {
false로 바꿔서 저장
} else {
true로 바꿔서 저장
}
}
/*처음 좋아요를 누른 경우*/
private void likesClick() {
유저의 정보 및 컨텐츠의 정보와 함께 좋아요 상태를 true로 저장
}
State Pattern (상태 패턴)
장점
public interface LikesState {
void clickLike();
}
// 좋아요 상태 : false
class LikeStateFalse implements LikesState {
@Override
public void clickLike() {
상태를 true로 바꿔 저장하는 로직 작성
// 마지막엔 상태를 반대로 전환시켜준다
likesButton.setLikeState(new LikeStateTrue());
}
}
// 좋아요 상태 : true
class LikeStateTrue implements LikesState {
@Override
public void clickLike() {
상태를 false로 바꿔 저장하는 로직 작성
likesButton.setLikeState(new LikeStateFalse());
}
}
public class LikesButton {
// 이 State Pattern 로직이 처음 실행될 때 좋아요의 상태는 무조건 true가 되도록 개발했기에 기본으로 설정해준다
private LikesState likeState = new LikeStateTrue();
public void setLikeState(LikesState likeState) {
this.likeState = likeState;
}
public void clickButton(LikesButton likesButton) {
likeState.clickLike(likesButton);
}
}
참고 블로그
https://victorydntmd.tistory.com/294
https://tall-developer.tistory.com/14
https://gre-eny.tistory.com/247
https://coding-start.tistory.com/247
https://johngrib.github.io/wiki/pattern/state/
https://steady-coding.tistory.com/387