[java] 동작 패턴

동작 패턴은 객체의 동작 및 상호작용을 설계하는 방법을 정의합니다. 다양한 동작 패턴을 통해 객체 간의 효율적이고 유연한 상호작용을 달성할 수 있습니다. 여기에서는 널리 사용되는 동작 패턴 몇 가지를 살펴보겠습니다.

1. 스트래티지 패턴

2. 옵저버 패턴

3. 커맨드 패턴


스트래티지 패턴

스트래티지 패턴은 동작을 정의하고 동작을 실행하는 객체를 분리하는 패턴입니다. 이 패턴은 실행 중에 동작을 변화시키고자 할 때 유용합니다. 예를 들어, 정렬 알고리즘을 동적으로 선택하고 싶을 때 스트래티지 패턴을 사용할 수 있습니다.

예제 코드

public interface SortingStrategy {
    void sort(int[] data);
}

public class QuickSort implements SortingStrategy {
    public void sort(int[] data) {
        // 퀵 정렬 구현
    }
}

public class MergeSort implements SortingStrategy {
    public void sort(int[] data) {
        // 합병 정렬 구현
    }
}

public class Sorter {
    private SortingStrategy strategy;

    public Sorter(SortingStrategy strategy) {
        this.strategy = strategy;
    }

    public void sortData(int[] data) {
        strategy.sort(data);
    }
}

옵저버 패턴

옵저버 패턴은 객체 간의 일대다 종속 관계를 정의합니다. 한 객체의 상태가 변경될 때, 해당 객체에 종속된 다른 객체들이 이를 인지하고 자동으로 업데이트될 수 있도록 합니다.

예제 코드

import java.util.*;

public interface Observer {
    void update();
}

public class Subject {
    private List<Observer> observers = new ArrayList<>();

    public void attach(Observer observer) {
        observers.add(observer);
    }

    public void detach(Observer observer) {
        observers.remove(observer);
    }

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

커맨드 패턴

커맨드 패턴은 요청을 객체의 형태로 캡슐화하여 매개변수화하고 여러 가지 동작을 지원하는 패턴입니다. 이를 통해 요청을 큐에 저장하거나 로깅하고, 요청을 취소할 수 있는 장점이 있습니다.

예제 코드

public interface Command {
    void execute();
}

public class LightOnCommand implements Command {
    private Light light;

    public LightOnCommand(Light light) {
        this.light = light;
    }

    public void execute() {
        light.turnOn();
    }
}

public class LightOffCommand implements Command {
    private Light light;

    public LightOffCommand(Light light) {
        this.light = light;
    }

    public void execute() {
        light.turnOff();
    }
}

각 동작 패턴은 객체 지향 소프트웨어 설계에서 공통적으로 발견되는 상황을 해결하기 위한 강력한 도구입니다. 이러한 패턴을 적절히 활용하면 유연하고 유지보수가 쉬운 소프트웨어를 설계할 수 있습니다.

더 많은 동작 패턴에 대해 알아보려면 GoF의 디자인 패턴을 확인하세요.