[ 구조 패턴 : 11개 ]
📌 개념
객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴
주체 객체와 상태의 변경을 알아야 하는 관찰 객체(Observer Object)는 1:1 or 1:N 관계
📌 장점
📌 단점
📌 개념
특정 컨텍스트에서 알고리즘을 별도로 분리하는 설계 방법
// 전략패턴이 적용되지 않은 경우
public class Calculator {
public double calculate(boolean isFirstGuest, boolean isLastGuest, List<Item> items) {
double sum = 0;
for (Item item : items) {
if (isFirstGuest) {
sum += item.getPrice() * 0.9;
} else if (!item.isFresh()) {
sum += item.getPrice() * 0.8;
} else if (isFirstGuest) {
sum += item.getPrice() * 0.8;
} else {
sum += item.getPrice();
}
}
return sum;
}
}
public class Item {
private final String name;
private final int price;
public Item(String name, int price) {
this.name = name;
this.price = price;
}
public int getPrice() {
return price;
}
public boolean isFresh() {
return true;
}
}
계산이라는 컨텍스트에서 적용되는 다양한 할인 알고리즘을 별도로 관리하면 if-else 분기문 사용안하고 생성자로 코드 작성 가능!
📌 장점
예를 들어 새로운 전략인 중간 손님을 대폭할인하는 정책이 추가되었다고 가정해보겠습니다. 그러면 아래와 같이 변할 것입니다.
기존 코드 : else-if 문이 추가될 것입니다.
전략패턴이 적용된 코드 : 새로운 클래스가 추가될 것입니다.
즉, 요구사항이 변경되었을 때 기존의 코드를 변경하지 않아도 된다는 것이 전략패턴의 장점이며 새로운 전략에 대해서는 새로운 클래스를 통해 관리하기 때문에 OCP의 원칙을 준수할 수 있는 패턴입니다
📌 단점
나머지는 안녕,,,,