행동 패턴
의 예시인 이터레이터, 전략, 옵저버 패턴에 대해 알아보자 🤭
이터레이터를 사용하여 컨테이너의 요소들에 접근하는 디자인 패턴. 각기 다른 자료 구조들을 똑같은 인터페이스로 순회할 수 있다는 장점 존재. 여기서 컨테이너란 동일한 요소들을 담아놓는 집합 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 라이브러리 (자바스크립트 라이브러리)
로그인에 관한 다양한 전략들을 쉽게 교체할 수 있게 만드는 디자인 패턴
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()); // 편지 전략
}
}
주체가 어떤 객체의 상태 변화를 관찰하다가, 상태 변화가 있을 때마다 메서드 등을 통해 옵저버 목록에 있는 옵저버들에게 객체의 변화를 알려주는 디자인 패턴