디자인 패턴

등장배경 1990년대 이전에는 하드웨어의 제약으로 인해 개발자들은 주로 하드웨어의 효율성을 최우선으로 고려한 코드를 작성하는 경향이 있었습니다. 즉, "기기 입장에서 효율적인 코드"가 중요시되었죠. 이러한 배경은 하드웨어 성능의 제한 때문에 발생했으며, 유지보수성이나 확장성보다는 실행 효율성이 더 중요한 고려사항이었습니다. 그러나 시간이 지나면서 하드웨어의 성능은 크게 향상되었습니다. 이러한 발전은 무어의 법칙이 예측한 것처럼 하드웨어의 성능이 지속적으로 빠르게 증가하면서 나타난 현상입니다. 하드웨어 성능의 향상으로 인해 개발자들은 하드웨어의 제약에서 벗어나 유지보수성, 확장성, 재사용성 등을 중요시하는 코드를 작성할 수 있게 되었습니다. 이러한 환경 변화 속에서 객체지향 프로그래밍(OOP)이 주목받게 ..
방문자 패턴 객체의 구조와 객체에 수행되는 작업을 분리한다. 기존 클래스를 변경하지 않고도 새로운 작업을 정의할 수 있게 한다. 구조 Visitor - 방문자 클래스들이 구현해야 할 인터페이스. 각 구체적인 요소 클래스(Element)를 방문(visit)하는 메소드를 선언한다. Concrete Visitor - Visitor 인터페이스를 구현하는 클래스. 구체적인 요소(Element)들에 대한 방문 동작을 구현한다. 각 요소에 대해 수행할 작업을 정의한다. Element - 요소 클래스들이 구현해야 할 인터페이스. 이 인터페이스는 Accept 메소드를 선언하여, 방문자 객체가 요소 객체를 방문할 수 있게 한다. Concrete Element - Element 인터페이스를 구현하는 클래스. 실제 데이터와 ..
템플릿 메소드 패턴 알고리즘의 골격을 정의한 메소드를 제공하고, 일부 단계를 서브클래스에서 구현하게 함으로써, 구조를 유지하면서도 특정 부분의 변경을 가능하게 하는 디자인 패턴. 구조 AbstractClass - 서브클래스들이 재정의를 통해 구현해야 하는 알고리즘 처리 단계의 기본 연산(골격)을 정의한다. 그리고 알고리즘의 뼈대를 정의하는 템플릿 메서드를 구현한다. ConcreteClass - 서브클래스마다 달라진 알고리즘 처리 단계를 수행하기 위한 기본 연산을 구현한다. 기본 인터페이스 // 추상 기본 클래스 public abstract class AbstractClass { // 템플릿 메소드 public void TemplateMethod() { BaseOperation(); // 기본 작업 ..
전략 패턴 여러 알고리즘을 캡슐화하고 상호 교환 가능하게 만드는 패턴. 알고리즘을 사용하는 클라이언트와 상관 없이 독립적으로 알고리즘을 다양하게 변경할 수 있다. 구조 Strategy - 제공하는 모든 알고리즘에 대한 공통 연산들을 인터페이스로 정의한다. Context 클래스는 ConcreteStrategy 클래스에서 정의한 인터페이스를 통해 실제 알고리즘을 사용한다. ConcreteStrategy - Strategy의 인터페이스를 실제 알고리즘으로 구현한다. Context - ConcreteStrategy 객체를 통해 구성된다. Strategy 객체에 대한 참조를 관리하고, 실제로는 Strategy 서브클래스(ConcreteStrategy)의 인스턴스를 갖고 있음으로써 구체화한다. 또한 St..
옵저버 패턴 객체를 가볍게 만들어 메모리 사용량을 줄이는 패턴. 자주 변하는 속성과 불변 속성을 분리하고 불변 속성을 재사용함으로써 메모리 사용량을 줄일 수 있다. 구조 Subject - Observer(감시자)를 을 알고 있는 구독자. 임의의 개수의 감시자 객체는 Subject를 감시한다. Subject의 상태가 변경되면 Observer에게 알림을 보낸다. Observer - Subject의 상태 변화를 갱신하는 데 필요한 인터페이스를 정의한다. Subject의 변경에 따라 변화되어야 하는 객체들의 일관성이 유지된다. ConcreteSubject - ConcreteObserver 객체에게 알려주어야 하는 상태를 저장한다. 상태가 변경되면 해당 ConcreteObserver에 변경을 통보한다. Con..
상태 패턴 객체 내부 상태 변경에 따라 객체의 행동이 달라지는 패턴. 상태에 특화된 행동들을 분리해 낼 수 있으며, 새로운 행동을 추가하더라도 다른 행동에 영향을 주지 않는다. 구조 Context - 사용자가 관심 있는 인터페이스를 정의한다. 객체의 현재 상태를 정의한 ConcreteState 클래스 객체를 유지 및 관리한다. State - Context의 각 상태별로 필요한 핸동을 캡슐화하여 인터페이스로 정의한다. ConcreteState 클래스들 - 각 서브클래스들은 Context의 상태에 따라 처리되어야 할 실제 행동을 구혀한다. 기본 인터페이스 public interface IState { void Handle(Context context); } public class ConcreteSta..
메멘토 패턴 객체의 상태를 이전의 상태로 복원할 수 있는 방법을 제공하는 디자인 패턴. 객체의 상태를 캡처하고 필요할 때 그 상태를 복원하는 기능을 통해, 객체의 내부 상태에 대한 직접적인 접근을 피하면서도 상태 정보를 외부에 저장하고 관리할 수 있다. 구조 Memento - 객체의 내부 상태를 저장하는 클래스. 객체의 상태를 저장하거나 복원하기 위해 사용된다. Originator - 원조 객체. 메멘토를 생성하여 현재 객체의상태를 저장하고, 메멘토를 사용하여 내부 상태를 복원한다. Caretaker - 메멘토의 보관을 책임지는 클래스. 메멘토의 내부 상태를 읽거나 접근하지 못하고 단지 보관만 한다. 기본 인터페이스 public class Memento { public string State { ge..
중재자 패턴 객체 간의 복잡한 상호작용을 캡슐화하는 디자인 패턴. 객체들 사이의 직접적인 참조와 통신을 줄이고, 이를 대신하여 중재자 객체를 통해 상호작용하도록 함으로써 객체 간의 결합도를 낮춘다. 구조 Mediator - 각 객체간 상호작용에 필요한 인터페이스를 정의한다. ConcreteMediator - Colleague 객체간의 협력 행동을 구현한다. 자신이 맡은 Colleague를 파악하고 관리한다. Colleague - 시스템 내의 객체들로, 서로 직접적으로 통신하지 않고 중재자를 통해 상호작용한다. 각 객체는 중재자에 대한 참조를 가지고 있어야 한다. 기본 인터페이스 public interface IMediator { void SendMessage(string message, Colleag..
NewtronVania
'디자인 패턴' 태그의 글 목록