DesignPattern #행위

곽서현·2022년 11월 16일
0

[ 구조 패턴 : 11개 ]

✅ 옵저버(Observer) 패턴

📌 개념
객체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드 등을 통해 객체가 직접 목록의 각 옵저버에게 통지하도록 하는 디자인 패턴

주체 객체와 상태의 변경을 알아야 하는 관찰 객체(Observer Object)는 1:1 or 1:N 관계

📌 장점

  • 실시간으로 한 객체의 변경사항을 다른 객체에 전파할 수 있다.
  • 느슨한 결합으로 시스템이 유연하고 객체간의 의존성을 제거할 수 있다.

📌 단점

  • 너무 많이 사용하면 상태관리가 힘들다.
  • 데이터 배분에 문제가 생길 수 있다.

✅ 전략(Strategy) 패턴

📌 개념
특정 컨텍스트에서 알고리즘을 별도로 분리하는 설계 방법

	// 전략패턴이 적용되지 않은 경우
    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의 원칙을 준수할 수 있는 패턴입니다

📌 단점

  • 모든 상황에서 전략패턴이 유용한 것은 아니다.

나머지는 안녕,,,,

0개의 댓글