JAVA 자바 디자인 패턴 : 전략 패턴, 옵저버 패턴, 장점 단점, 예시

2024. 4. 16. 21:18코딩/코딩 테스트

JAVA 자바 디자인 패턴 : 전략 패턴

 

전략 패턴(Strategy Pattern)은 행동을 클래스의 집합으로 정의하고, 이들을 상호 교환 가능하게 만드는 디자인 패턴입니다. 이 패턴은 객체의 행동을 동적으로 변경할 수 있게 해주어 같은 문제를 해결할 수 있는 여러 알고리즘을 클라이언트 코드에서 직접적으로 분리할 수 있게 합니다. 전략 패턴은 클라이언트가 사용할 알고리즘의 변형을 캡슐화하고, 각 알고리즘을 서로 교체할 수 있게 함으로써 동일한 작업을 다른 방식으로 수행할 수 있도록 합니다.

 

 

 

전략 패턴 구현 예시

다음은 자바로 구현한 간단한 전략 패턴의 예입니다. 여기서는 여러 종류의 정렬 전략을 사용하는 상황을 가정합니다.

 

// 전략 인터페이스 정의
interface SortingStrategy {
    void sort(int[] array);
}

// 구체적인 전략 1: 버블 정렬
class BubbleSortStrategy implements SortingStrategy {
    public void sort(int[] array) {
        System.out.println("Sorting using bubble sort");
        // 버블 정렬 알고리즘 구현
    }
}

// 구체적인 전략 2: 선택 정렬
class SelectionSortStrategy implements SortingStrategy {
    public void sort(int[] array) {
        System.out.println("Sorting using selection sort");
        // 선택 정렬 알고리즘 구현
    }
}

// 컨텍스트 클래스
class SortedList {
    private SortingStrategy strategy;
    private int[] items;

    public void setSortingStrategy(SortingStrategy strategy) {
        this.strategy = strategy;
    }

    public void add(int item) {
        // 배열에 항목 추가 로직
    }

    public void sort() {
        strategy.sort(items);
    }
}

public class StrategyExample {
    public static void main(String[] args) {
        SortedList list = new SortedList();
        list.add(1);
        list.add(3);
        list.add(2);

        list.setSortingStrategy(new BubbleSortStrategy());
        list.sort();

        list.setSortingStrategy(new SelectionSortStrategy());
        list.sort();
    }
}

 

 

전략 패턴의 장점

  1. 확장성: 새로운 전략을 추가하는 것이 쉽습니다. 기존 코드를 변경하지 않고 새로운 클래스를 추가하기만 하면 됩니다.
  2. 교체 용이성: 실행 시간에 전략을 쉽게 교체할 수 있습니다. 이는 동적으로 행동을 변경할 수 있는 유연성을 제공합니다.
  3. SOLID 원칙 준수: 특히 개방-폐쇄 원칙(OCP)과 단일 책임 원칙(SRP)을 잘 지킵니다. 각 전략 클래스는 하나의 알고리즘을 책임지며, 시스템은 새로운 전략을 추가함으로써 확장할 수 있습니다.

 

전략 패턴의 단점

  1. 클래스 수 증가: 각각의 전략마다 별도의 클래스가 필요하기 때문에 시스템의 클래스 수가 많아질 수 있습니다.
  2. 복잡성 증가: 전략을 설정하고 사용하는 로직이 복잡해질 수 있으며, 사용자는 다양한 전략을 이해하고 올바르게 사용해야 합니다.

 

 

 

 

 

 

 

 

 

 


 

JAVA 자바 디자인 패턴 : 옵저버 패턴

 

옵저버 패턴(Observer Pattern)은 객체의 상태 변화를 관찰하고 이러한 변화에 반응하는 객체들에게 알림을 보내는 디자인 패턴입니다. 이 패턴은 주로 분산 시스템에서 이벤트 핸들링 시스템이나 MVC(Model-View-Controller) 아키텍처와 같은 곳에서 사용됩니다. 옵저버 패턴은 특히 데이터의 변화를 여러 클라이언트(옵저버)들과 공유해야 할 때 유용합니다.

 

옵저버 패턴의 기본 구조

옵저버 패턴은 두 가지 주요 구성 요소로 이루어져 있습니다:

  1. Subject: 상태 변화를 갖는 객체로, Observer 객체들을 관리합니다. Observer들을 등록, 제거하고, 상태 변화가 있을 때 Observer들에게 알림을 보냅니다.
  2. Observer: Subject의 상태 변화에 반응하는 객체로, Subject로부터 상태 변화를 통지받아 이에 대응하는 행동을 취합니다.

 

자바에서의 옵저버 패턴 예시

다음은 간단한 주식 가격 트래커 시스템을 구현한 예입니다. 여기서 Stock 클래스는 Subject 역할을 하며, 가격 변화에 따른 알림을 Observer 인터페이스를 구현한 여러 클래스에게 보냅니다.

 

 

import java.util.ArrayList;
import java.util.List;

// Observer 인터페이스
interface Observer {
    void update(float price);
}

// Subject 인터페이스
interface Subject {
    void registerObserver(Observer o);
    void removeObserver(Observer o);
    void notifyObservers();
}

// 구체적인 Subject 클래스
class Stock implements Subject {
    private List<Observer> observers;
    private float price;

    public Stock() {
        this.observers = new ArrayList<>();
    }

    public void setPrice(float price) {
        this.price = price;
        notifyObservers();
    }

    public void registerObserver(Observer o) {
        observers.add(o);
    }

    public void removeObserver(Observer o) {
        observers.remove(o);
    }

    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(price);
        }
    }
}

// 구체적인 Observer 클래스
class PriceDisplay implements Observer {
    private float lastPrice;

    @Override
    public void update(float price) {
        lastPrice = price;
        System.out.println("Updated stock price: $" + price);
    }
}

public class Main {
    public static void main(String[] args) {
        Stock stock = new Stock();
        PriceDisplay display = new PriceDisplay();

        stock.registerObserver(display);
        stock.setPrice(100);
        stock.setPrice(102);
        stock.setPrice(97);
    }
}

 

 

 

옵저버 패턴의 장점

  1. 낮은 결합도: Subject와 Observer는 서로 독립적으로 개발할 수 있으며, Subject는 Observer의 구체적인 클래스를 모릅니다.
  2. 동적인 구독 관리: 실행 중에 Observer를 추가하거나 제거할 수 있습니다.
  3. 다양한 변경에 대응: 다양한 Observer가 같은 이벤트에 대해 다르게 반응할 수 있습니다.

 

옵저버 패턴의 단점

  1. 메모리 누수: Observer가 제대로 제거되지 않으면 참조가 남아 메모리 누수가 발생할 수 있습니다.
  2. 순서 의존성: Observer들이 통지를 받는 순서가 중요할 경우, 이를 관리하기 어려울 수 있습니다.
  3. 성능 문제: 많은 Observer가 등록되어 있거나, 통지 과정이 복잡할 경우 성능 저하가 발생할 수 있습니다.

 

 

 

 

 

 

 

 

JAVA 자바 디자인 패턴 : 전략 패턴, 옵저버 패턴, 장점 단점, 예시