디자인 패턴 정리
- 스트레티지 패턴
: #캡슐화 #독립적사용
$ 다양한 특성 줄 때
$ 오리의 기본 특성(quack, swim, display…) 상속을 이용한다면 코드중복, 실행시 특징 바꾸기 힘듦, 모든 오리의 행동을 알기 힘듦, 날면서 꽥꽥할 수 없다.
$ 구현이 아닌 인터페이스에 맞춰서 프로그래밍하라 > 각 행동은 인터페이스(Fly, Quack)로 표현하고 행동을 구현할 때 인터페이스를 구현받아 작성한다.
:> 오리는 나는 행동과 꽥 행동을 가지고 있다. 각 행동은 독립적으로 존재한다.
- 옵저버 패턴
: #이벤트 #관찰
$ 뭔가 중요한 일이 일어났을 때 객체들한테 새소식을 알려줄 수 있는 패턴
$ 신문이나 잡지를 어떤 식으로 구독하는지는 아시죠?
- 신문사가 사업을 시작하고 신문을 찍어내기 시작합니다.
- 독자가 특정 신문사/잡지사에 구독 신청을 하면 매번 새로운 신문/잡지가 나올 대마다 배달을 받을 수 있습니다. 계속 구독자로 남아있는 이상 계속해서 신문/잡지를 받을 수 있습니다.
- 신문을 더 이상 보고 싶지 않으면 구독 해지 신청을 합니다. 그러면 더 이상 신문이 오지 않습니다.
- 신문사가 계속 영업을 하는 이상 여러 개인 독자, 호텔, 항공사 및 기타 회사 등에서 꾸준히 구독 및 해지를 하게 됩니다.
- $ 출판사+구독자 = 옵저버 패턴
- 신문 구독 메커니즘만 제대로 이해할 수 있다면 옵저버 패턴을 쉽게 이해할 수 있습니다. 출판사를 주제(subject), 구독자를 옵저버(observer)라고 부른다는 것만 외워두세요.
$ 기상 측정 시스템을 만들어 볼까요?
:> 주제(WeatherData)의 observers ArrayList에 옵저버를 등록하고 해지한다. notifyObserver할 때 등록된 옵저버들에게 이벤트 전송
- 데코레이터 패턴
: #기존의 클래스를 바꾸지 않고 새로운 임무 부여 #꾸미기
디자인원칙 : 클래스는 확장에 대해서는 열려 있어야 하지만 코드 변경에 대해서는 닫혀 있어야 한다.
$ OCP(Open-Closed Principle) : 기존 코드는 건드리지 않은 채로 확장을 통해서 새로운 행동을 간단하게 추가할 수 있도록 하는 게 바로 우리의 목표입니다. 새로운 기능을 추가하는 데 있어서 매우 유연해서 급변하는 주변 환경에 잘 적응할 수 있으면서도 강하고 튼튼한 디자인을 만들 수 있겠죠.
그러면 객체를 어떻게 ‘장식’할 수 있을까요? 힌트: 데코레이터 객체를 ‘Wrapper’ 객체라고 생각해보세요.
:> 음료 수퍼 클래스(A)를 상속받는 꾸밈을 받을(단독으로 존재할 수 있는) 클래스[DarkRoast, HouseBlend, Espresso, …] 그리고 꾸며줄 데코들의 수퍼 클래스(A extends Beverage)를 상속받는 데코 클래스[Milk, Soy, Mocha, …] 데코 클래스의 생성자에 Beverage를 넣어 감싸서 꾸며준다. (여러번 감쌀 수 있음)
- 팩토리 패턴
- :#공장 , #틀찍기 #분점 별 특징
-
팩토리 메소드 패턴에서는 객체를 생성하기 위한 인터페이스를 정의하는데, 어떤 클래스의 인스턴스를 만들지는 서브클래스에서 결정하게 만듭니다. 팩토리 메소드 패턴을 이용하면 클래스의 인스턴스를 만드는 일을 서브클래스에게 맡기는 것이죠.
피자를 만드는 피자팩토리
- 싱글턴 패턴
:#하나뿐인
public class Singleton {
private static Singleton uniqueInstance;
private Singleton() {}
public static Singleton getInstance() {
if(uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}