디자인 패턴

디자인 패턴은 디자인 문제에 대한 솔루션의 재사용 가능한 형태입니다. 아이디어는 건축가 크리스토퍼 알렉산더 (Christopher Alexander)에 의해 소개되었으며 컴퓨터 과학과 같은 다양한 분야에 적용되었습니다.

소프트웨어 디자인 패턴
소프트웨어 설계 패턴은 소프트웨어 설계 중에 자주 접하게되는 비슷한 문제를 해결하기 위해 개발 된 일반적인 솔루션에 대한 제안입니다. 소프트웨어 디자인 패턴은 일반적으로 프로그래밍 언어와 독립적으로 정의되지만, 객체 지향 프로그래밍 언어에 적합한 소프트웨어 디자인 패턴이 더 일반적으로 알려져 있습니다. 이 패턴은 객체와 클래스 간의 관계 및 상호 작용을 보여줍니다. 프로그래머는 손에 든 문제를보고 디자인 패턴을 사용자 정의 할 수 있습니다.

세부
특정 필드와 관련된 디자인 패턴의 조직화 된 컬렉션을 패턴 언어라고합니다. 이 언어는 설계자가 직면 한 상황을 논의하기위한 공통 용어를 제공합니다.

이 언어의 요소는 패턴이라고하는 개체입니다. 각 패턴은 환경에서 반복적으로 발생하는 문제를 설명하고 그 문제에 대한 솔루션의 핵심을 설명합니다.이 솔루션을 수백만 번 이상 사용할 수있는 방식으로, 같은 방식으로 두 번 반복하지 않아도됩니다 . – 크리스토퍼 알렉산더

패턴을 문서화하려면 특정 상황에서 문제가 발생하는 이유와 패턴의 구성 요소가 서로 관련되어 솔루션을 제공하는 방법을 설명해야합니다. 크리스토퍼 알렉산더 (Christopher Alexander)는 햇볕이 잘 드는 방을 원하는 것과 여름 오후에 과열하지 않기를 원하는 것 사이의 갈등과 같은 “상충하는 힘”으로 인해 일반적인 디자인 문제를 설명합니다. 패턴은 디자이너에게 방에 넣을 창 수를 알려주지 않습니다. 대신 디자이너가 특정 애플리케이션에 가장 적합한 결정을 내릴 수 있도록 일련의 값을 제안합니다. 예를 들어, 알렉산더는 방 전체에 빛을 비추기에 충분한 창문이 있어야한다고 제안합니다. 그는 이것이 거주자들의 방의 즐거움을 증가 시킨다고 믿기 때문에 이것을 좋은 해결책이라고 생각합니다. 다른 저자들은 난방비 또는 재료비에 더 높은 가치를두면 다른 결론을 도출 할 수 있습니다. 패턴의 작성자가 “최상의”솔루션을 결정하기 위해 사용하는이 값은 패턴 내에서 문서화되어야합니다.

패턴 문서는 적용 가능한시기를 설명해야합니다. 두 개의 주택이 서로 매우 다를 수 있으므로 주택 디자인 패턴은 두 가지 모두에 적용 할 수있을 정도로 넓어야하지만 너무 모호하지 않아 디자이너가 결정을 내리는 데 도움이되지 않습니다. 패턴을 사용할 수있는 상황의 범위를 문맥이라고합니다. 예를 들어 “모든 주택”, “모든 2 층 주택”또는 “사람들이 시간을 보내는 모든 곳”이있을 수 있습니다.

예를 들어 크리스토퍼 알렉산더 (Christopher Alexander)의 연구에서 버스 정류장과 수술실의 대기실은 모두 “기다릴 곳”이라는 문맥 안에 있습니다.

디자인 패턴 클래스
Quadruple Gang의 디자인 패턴 책 (ISBN 0-201-63361-2)은 세 패턴의 디자인 패턴을 구별하지만, 서로 분리하는 예리한 기준은 없습니다.

창조 패턴
생성 패턴은 소프트웨어 객체 (또는 다른 말로 클래스 인스턴스)를 생성하는 방법에 대한 제안을 제공합니다. 아이디어는 좋은 소프트웨어가 포함 된 객체가 어떻게 생성되는지 독립적으로 설계되어야한다는 것입니다. 다시 말해서, 객체가 생성되는 방법과 방법은 객체가 속한 소프트웨어의 작동에 영향을 미치지 않습니다. 새로운 기능을 추가해서는 안되며 변경 사항에 문제가 있어서는 안됩니다.

소프트웨어 시스템이 발전함에 따라 객체 구성은 클래스 상속보다 중요성이 커집니다. 그 이유는 소프트웨어 시스템의 간단한 기본 동작 패턴을 정의하는 데 기반한 디자인이 고정 된 동작을 기반으로하는 디자인보다 더 유연하다는 것입니다. 즉, 객체에 동작을 조합하여 추가하면 나중에 소프트웨어의 개발에 따라 동작을 수정할 수 있습니다. 이 경우 개발 된 소프트웨어의 기본 동작 요구 사항을 기반으로 한 디자인을 사용하면 객체 인터페이스를 수정하지 않고도 서로 다른 또는보다 복잡한 동작을 사용할 수 있습니다.

그러나 객관적인 조합을 통해 기본 동작을 제공하는 객체를 샘플링하거나 동작을 상속하거나 변경하여 파생 클래스에서 객체를 만드는 것이 더 어렵습니다. 생성 패턴에는 이러한 어려움을 극복하는 데 사용할 수있는 소프트웨어 패턴이 포함됩니다.

생성 패턴은 소프트웨어 시스템에 객체 클래스에 사용되는 구체적인 클래스와 이러한 인스턴스가 생성되고 어셈블되는 방법을 저장합니다.

공장 방법
오브젝트가 오브젝트 작성에 사용되는 단일 인터페이스 아래에서 오브젝트를 작성하는 f}을 계승함으로써 오브젝트 작성 기능을 서브 클! 스에 남겨 두어 인터페이스에 남겨 둡니다.

예 (프로토 타입 패턴)
복잡하거나 비싼 클래스에서 객체를 만들 때 처음부터 생성되는 대신 기존 객체에서 샘플링하여 새 객체를 만들 수 있습니다. 이러한 방식으로 새로운 객체가 쉽게 생성되고 리소스가 불필요하게 점유되지 않습니다.

추상 공장 패턴
단일 인터페이스로 다른 플랫폼에서 오브젝트 패밀리를 작성할 수 있습니다. 번호가 매겨진이 소프트웨어 응용 프로그램은 행동 변화없이 다른 플랫폼으로 이동할 수 있습니다. 추상 팩토리 패턴은 단일 인터페이스 아래에서 사용되는 구체적인 클래스를 유지합니다.

작성자 패턴
단일 인터페이스를 통해 복잡한 개체 그룹을 필요에 따라 여러 조각으로 만들 수 있습니다. 사용자가 객체 그룹을 사용하면 객체 그룹이 필요한 방향으로 구성됩니다. 사용하지 않는 부품은 불필요하게 만들어지며 자원을 소비하지 않습니다.

싱글 톤 패턴
클래스에서는 하나의 객체 만 만들어집니다. 이 객체는 응용 프로그램의 어느 곳에서나 액세스 할 수 있습니다. 오브젝트가 처음 사용될 때까지는 오브젝트가 작성되지 않을 수 있습니다.

구조 패턴
구조 패턴 클래스와 객체를 결합하여 더 넓은 소프트웨어 구조를 구축 할 수있는 제안을 제공합니다. 클래스 구조 패턴과 오브젝트 구조 패턴은 두 가지로 나뉩니다.

클래스 구조 패턴은 클래스 상속 또는 컴 파운딩 응용 프로그램을 사용하여 구조를 확장합니다. 객체 구조 패턴은 객체를 결합하여 새로운 기능을 얻는 방법을 보여줍니다.

복합 패턴
객체를 트리 구조와 함께 전체적으로 결합 할 수 있으며이 인터페이스는 단일 인터페이스에서 도달 할 수 있습니다. 복합 구조는 새 오브젝트를 추가하고 제거하여 시간이 지남에 따라 확장되거나 축소 될 수 있습니다.

외관 (외관 패턴)
단일 인터페이스에서 복잡한 구조를 함께 사용할 수 있습니다.

장식 패턴
객체를 변경하지 않고 객체가 새로운 책임을 추가 할 수 있습니다. 하위 분류없이 객체의 기능을 향상시킬 수 있습니다.

브릿지 패턴
인터페이스와 구체적인 구현을 서로 분리 할 수 ​​있습니다. 인터페이스를 변경해도 인터페이스에는 영향을주지 않습니다. 둘 다 독립적으로 개발 될 수 있습니다.

플라이급 패턴
많은 수의 유사한 개체를 만드는 대신 예제 개체에서 시각적 개체를 만들어 복잡한 개체 구조를 만들 수 있습니다. 시각적 객체의 상태 변수는 객체 자체가 아닌 사용자가 저장합니다.

어댑터 패턴
다른 소스의 객체 또는 클래스 인터페이스를 적용하는 데 사용됩니다.

프록시 패턴
복잡하고 값 비싸며 구축하기 어려운 객체를 사용하기 위해 인터페이스를 모방하는 것이 가능합니다. 객체의 실제 객체의 방향을 사용하여 사용자로부터 숨길 수 있습니다.

행동 패턴
행동 패턴은 객체간에 기능적 책임을 할당 할 수있는 방법과 소프트웨어에서 요구하는 솔루션 방법을 객관적으로 사용할 수있는 방법에 대한 제안을 제공합니다. 행동 패턴은 또한 객체와 클래스 패턴뿐만 아니라 객체 간의 통신과 관련된 패턴을 제공합니다. 행동 패턴을 통해 설계자는 객체 간의 통신 및 통신 방법에 집중할 수 있습니다.

행동 패턴은 구조 패턴과 마찬가지로 클래스 행동 패턴과 객체 행동 패턴으로도 나뉘어집니다.

클래스 동작 패턴을 사용하면 상속을 사용하여 클래스간에 동작을 분산시킬 수 있습니다. 객체 행동 패턴은 객체 구성을 통해 단일 객체에 의해 쉽게 달성 될 수없는 객체 그룹을 통해 행동을 성취하는 것을 가능하게합니다.

조정자 패턴
서로 연결된 객체는 동일한 지붕 아래 한 지점 (즉, 파인더)에서 안내 할 수 있습니다. 검색 파인더에 연결된 객체는 상태 변경을 검색 파인더에 전달합니다. 파인더는 응용 프로그램에서 필요한 편집 및 주문과 관련된 객체의 요청을 찾습니다. 최상위 레벨 사용자 객체는 파인더에만 연결됩니다.

상태 패턴
그것은 객체가 상황에 따라 행동을 바꿀 수있게합니다. 사용자의 관점에서, 그것은 당신이 객체 클래스를 수정하고 있다는 인상을 준다. 응용 프로그램에서 요구하는 방향으로 새로운 비헤이비어를 추가하고 제거 할 수 있습니다. 사용자 개체는 이러한 변경의 영향을받지 않습니다.

옵저버 패턴
그것은 관찰 대상의 변화를 자동으로 개체 그룹, 관찰자에게 알려줍니다. 관찰중인 개체는 추적 대상과 독립적으로 계속 기능합니다. 새로운 옵서버가 참여하거나 떠날 수 있습니다. 이런 식으로 어플리케이션은 시간이 지남에 따라 행동을 바꿀 수 있습니다.

템플릿 방법 패턴
프로 시저를 솔루션 템플리트로 사용할 수 있습니다. 다이의 일부 처리 단계가 서브 클래스에 의해 처리 될 수 있습니다. 따라서 주 패턴을 변경하지 않고 일부 중간 단계를 변경할 수 있습니다. 사용자는 이러한 변경 사항을 인식하지 못합니다.

명령 패턴
사용자 (객관적인) 요청을 객체로 변환하고 처리 할 수 ​​있습니다. 이러한 방식으로 다양한 사용자의 소원을 객관적인 기록으로 변환하고 대기열 또는 기록에 보관할 수 있습니다. 이 볼트에서 이루어진 트랜잭션을 되돌릴 수도 있습니다.

책임 사슬 (책임 패턴의 사슬)
사용자 (objective)는 여러 객체에 의해 요청이 평가되도록합니다. 사용자는 단일 인터페이스를 통해 요청을 전송합니다. 요청은 요청에 연결된 객체에 의해 차례로 처리됩니다. 요청이 환영받을 때까지 한 객체에서 다른 객체로 요청이 전송됩니다. 시간이 지남에 따라 체인에 새 오브젝트를 추가하거나 제거 할 수 있습니다. 이러한 변경으로 인해 사용자는 인터페이스의 영향을받지 않습니다.

통역 패턴
복잡한 응용 프로그램의 요구 사항을 충족시키기 위해 정의 된 의사 언어는 인터프리터 템플릿입니다. 가짜 언어를 사용하면 문법 규칙을 클래스로 정의하여 쉽게 적용 할 수 있습니다. 문법 규칙은 클래스로 정의되기 때문에 쉽게 수정하고 향상시킬 수 있습니다.

야디 가르 (유적 패턴)
Yadigâr는 응용 프로그램 소프트웨어에서 중요한 역할을하는 객체의 상태를 숨기고 필요할 때 상기 시키거나 상기시키기 위해 사용됩니다.

반복자 패턴
그것은 대량 객체 (Aggragate Object) 아래에있는 객체가 객체의 표현 또는 구현 방법에 관계없이 순서대로 도달 할 수있게합니다. 이 방법으로 표현 된 객체는 단일 인터페이스를 통해 액세스 할 수 있습니다.

전략 (전략 패티)
동일한 인터페이스에서 동일한 문제를 해결할 수있는 여러 솔루션 방법이 클래스를 숨기므로 어떤 방법을 사용하는지 알지 못하고 사용자 개체의 요청을 충족시킬 수 있습니다. 사용자는 동일한 종류의 개체로 작업하고 있다고 주장 할 때 다양한 형태의 동작에 직면합니다.

방문자 패턴
복합 구조에 새로운 연산을 추가 할 수 있습니다. 방문객은 복합 구조 내의 개별 객체를 방문하고 필요한 정보를 수집하여 처리하고 사용자에게 제공합니다.