[CS] 이터레이터, 전략, 옵저버 패턴

최지나·2023년 10월 21일
2

CS

목록 보기
11/55

행동 패턴의 예시인 이터레이터, 전략, 옵저버 패턴에 대해 알아보자 🤭

이터레이터 패턴

이터레이터를 사용하여 컨테이너의 요소들에 접근하는 디자인 패턴. 각기 다른 자료 구조들을 똑같은 인터페이스로 순회할 수 있다는 장점 존재. 여기서 컨테이너란 동일한 요소들을 담아놓는 집합 ex) 배열, 맵

  • 컬렉션 구현 방법을 노출시키지 않으면서도 그 집합체 안에 들어있는 모든 항목에 접근할 수 있게 해주는 방법을 제공해주는 패턴
  • 이터레이터 패턴을 사용하면 집합체 내에서 어떤 식으로 일이 처리되는지 몰라도 그 안에 들어있는 항목들에 대하여 반복작업을 수행할 수 있다
  • 맵이든 배열이든 상관없이 하나의 자료구조만으로 각기 다른 자료 구조들을 탐색할 수 있음

ex) 서로 다른 맵, 집합 배열 (자료구조)를 하나의 이터레이터 인터페이스 만으로 탐색 가능

import java.util.*;

public class IteratorExample {
    public static void main(String[] args) {
        // 자료구조 1: 맵
        Map<String, Integer> mp = new HashMap<>();
        mp.put("a", 1);
        mp.put("b", 2);
        mp.put("cccc", 3);

        // 자료구조 2: 집합
        Set<Integer> st = new HashSet<>();
        st.add(1);
        st.add(2);
        st.add(3);

        // 자료구조 3: 배열 (ArrayList를 사용)
        List<Integer> a = new ArrayList<>();
        for (int i = 0; i < 10; i++) a.add(i);

        // 이터레이터 패턴을 사용하여 컬렉션을 순회
        System.out.println("Iterating through the list (array):");
        Iterator<Integer> aIterator = a.iterator();
        while (aIterator.hasNext()) {
            Integer aa = aIterator.next();
            System.out.println(aa);
        }

        System.out.println("Iterating through the map:");
        Iterator<Map.Entry<String, Integer>> mpIterator = mp.entrySet().iterator();
        while (mpIterator.hasNext()) {
            Map.Entry<String, Integer> entry = mpIterator.next();
            System.out.println(entry.getKey() + " => " + entry.getValue());
        }

        System.out.println("Iterating through the set:");
        Iterator<Integer> stIterator = st.iterator();
        while (stIterator.hasNext()) {
            Integer aElement = stIterator.next();
            System.out.println(aElement);
        }
    }
}

전략 패턴

전략이라고 부르는 '캡슐화한 알고리즘'을 컨텍스트 안에서 바꿔주면서 상호 교체가 가능하게 만드는 디자인 패턴

  • 특정한 계열의 알고리즘들을 정의하고 각 알고리즘을 캡슐화하며 이 알고리즘들을 해당 계열 안에서 상호 교체가 가능하게 만든다
  • 새로운 전략을 추가하거나 기존 전략을 변경하기 쉬움
  • 코드의 유연성과 확장성이 향상

ex) 로그인 context => passport 라이브러리 (자바스크립트 라이브러리)

  • local storage(회원 가입 후 아이디 비번으로 로그인)
  • 구글 로그인
  • 카카오 로그인

로그인에 관한 다양한 전략들을 쉽게 교체할 수 있게 만드는 디자인 패턴

ex) 배송 시스템 구현

  • 서비스마다 다른 배송 전략 사용
  • 택배 서비스
  • 우편 서비스
import java.util.ArrayList;
import java.util.List;

// 배송 전략 인터페이스
interface DeliveryStrategy {
    void deliver(String address, String packageContents);
}

// 택배 배송 전략
class CourierDelivery implements DeliveryStrategy {
    @Override
    public void deliver(String address, String packageContents) {
        System.out.println("Package with contents: " + packageContents + " is being delivered to " + address + " via courier.");
    }
}

// 우편 배송 전략
class PostalDelivery implements DeliveryStrategy {
    @Override
    public void deliver(String address, String packageContents) {
        System.out.println("Package with contents: " + packageContents + " is being sent to " + address + " via postal service.");
    }
}

// 주문 클래스
class Order {
    private String address;
    private String packageContents;
    private DeliveryStrategy deliveryStrategy;

    public Order(String address, String packageContents) {
        this.address = address;
        this.packageContents = packageContents;
    }

    public void order(DeliveryStrategy deliveryStrategy) {
        this.deliveryStrategy = deliveryStrategy;
        deliverPackage();
    }

    private void deliverPackage() {
        if (deliveryStrategy != null) {
            deliveryStrategy.deliver(address, packageContents);
        } else {
            System.out.println("No delivery strategy selected.");
        }
    }
}

public class DeliveryServiceExample {
    public static void main(String[] args) {
        Order order = new Order("123 Main St, City", "Electronics");
        
        order.order(new CourierDelivery());  // 택배 전략
        order.order(new PostalDelivery());  // 편지 전략
    }
}

옵저버 패턴

주체가 어떤 객체의 상태 변화를 관찰하다가, 상태 변화가 있을 때마다 메서드 등을 통해 옵저버 목록에 있는 옵저버들에게 객체의 변화를 알려주는 디자인 패턴

  • 트위터의 메인 로직, 그리고 MVC 패턴에도 적용됨
  • 주체 스스로가 자신의 변화를 관찰하다가, 상태 변화가 있을 때 옵저버들에게 알려주는 경우도 존재

REF

profile
의견 나누는 것을 좋아합니다 ლ(・ヮ・ლ)

0개의 댓글