객체나 클래스 간의 통신과 책임을 관리하는 방법에 초점을 맞춘 소프트웨어 디자인 패턴
객체 간의 상호작용과 책임 분배를 효율적으로 설계하는 데 목적이 있으며, 복잡한 흐름이나 명령 구조를 단순화하여 프로그램의 유연성과 재사용성을 높임.
행위 패턴은 객체의 역할을 분명히 하고, 객체 간의 커뮤니케이션을 간결하게 만들어 코드의 이해와 유지 보수를 용이
전략 패턴:
상태 패턴:
템플릿 패턴:
반복자 패턴:
미들웨어 패턴:
커맨드 패턴:
컨텍스트 객체를 활성화시켜 변수 부분을 전략(Strategy)라는 별도 상호 교환 가능한 객체로 추출하여 로직 변경을 지원
컨텍스트는 알고리즘의 공통적인 로직,
전략은 가변적인 부분을 구현

컨텍스트의 상태에 따라 전략이 변경되는 패턴
상태 패턴은 상태에 따라 내부 전략이 동적으로 변경되는 패턴
상태 패턴을 사용하면 객체는 여러 상태 클래스 중 하나의 인스턴스를 현재 상태로서 갖게 되며, 상태 변화에 따라 이 인스턴스를 다른 것으로 교체할 수 있습니다.
내부에 교체되는 게 단순히 어떤 변수 값이 아니라 상태를 나타내는 객체 인스턴스가 변화하는 것
상태 패턴은 컨텍스트의 내부 상태에 따라 행동을 동적으로 변경할 수 있도록 설계된 패턴으로, 상태 각각을 객체로 캡슐화하여 관리합니다.

// 상태 인터페이스 정의 (각 상태가 공통적으로 구현할 메서드)
class TrafficLightState {
constructor(trafficLight) {
this.trafficLight = trafficLight;
}
handle() {
throw new Error('Handle method should be implemented');
}
}
// 녹색 신호 상태
class GreenState extends TrafficLightState {
handle() {
console.log("Green light - Go!");
this.trafficLight.changeState(new YellowState(this.trafficLight));
}
}
// 노란색 신호 상태
class YellowState extends TrafficLightState {
handle() {
console.log("Yellow light - Caution!");
this.trafficLight.changeState(new RedState(this.trafficLight));
}
}
// 적색 신호 상태
class RedState extends TrafficLightState {
handle() {
console.log("Red light - Stop!");
this.trafficLight.changeState(new GreenState(this.trafficLight));
}
}
// 컨텍스트 클래스
class TrafficLight {
constructor() {
this.state = new RedState(this); // 초기 상태 설정
}
changeState(newState) {
this.state = newState;
}
request() {
this.state.handle();
}
}
// 사용 예
const trafficLight = new TrafficLight();
trafficLight.request(); // Red light - Stop!
trafficLight.request(); // Green light - Go!
trafficLight.request(); // Yellow light - Caution!
전략 패턴과 비슷.
전략 패턴은 실행 시 동적으로 수행하지만,
템플릿 패턴은 구체적인 클래스 정의 순간 전체 컴포넌트 동작 결정
템플릿 메소드 패턴은 알고리즘의 구조를 메소드로 정의하고, 알고리즘의 일부 단계를 서브클래스에서 구현할 수 있게 합니다. 이 패턴에서는 추상 클래스가 전체적인 알고리즘의 흐름(템플릿)을 제어하며, 구체적인 단계는 서브클래스에 의해 정의됩니다.
반면 전략 객체는 실행 시간에 교체될 수 있기 때문에, 애플리케이션의 동작을 유연하게 변경할 수 있습니다.
기본적이고 매우 중요해서 프로그래밍 언어 자체에 내장됨
컬렉션 객체의 요소들을 순회하는 방법을 제공하며, 컬렉션의 내부 구현이 클라이언트로부터 분리되도록 합니다.
반복자 패턴은 상태저장 객체이다.

표준 함수는 함수 자체의 호출에 해당하는 진입점을 하나만 가질 수 있지만,
제너레이터는 yield문으로 일시 중단된 다음 나중에 해당 지점에서 다시 시작할 수 있음.
제너레이터는 반복자를 구현하는데 매우 적합함.
미들웨어 패턴은 소프트웨어 개발에서 데이터나 요청을 처리하기 위해 여러 개의 소프트웨어 계층 또는 구성 요소 사이에서 중개 역할을 수행하는 구조
미들웨어는 클라이언트와 서버 사이에서 요청과 응답을 조정하고 가공하는 중간 계층으로 작동
실행에 필요한 모든 정보들을 캡슐화, 이렇게 만든 모든 객체를 명령(command)라고 함.
함수나 기능을 직접적으로 호출하는 대신 호출을 수행하려는 의도를 나타내는 객체를 만든다.
명령 객체가 함수 호출에 필요한 정보를 캡슐화