디자인 패턴은 코드 재사용 및 서비스 용이성 향상을 위해 이러한 원칙을 구현하기 위한 것입니다. 이 원리는 버트 랜드 마이어가 제안한 것이다. 원문은' 소프트웨어 실체는 확장에 개방해야 하지만 수정에는 폐쇄해야 한다' 는 것이다. 즉, 모듈은 확장에 개방되고 수정은 폐쇄되어야 합니다. 원래 코드를 수정하지 않고 모듈을 확장해야 합니다. 그럼 어떻게 확장할 수 있을까요? 공장 모델을 살펴보십시오. 중관촌에 해적판 CD 와 포르노를 파는 아이가 있다고 가정해 봅시다. 우리는 그에게 CD 판매 관리 소프트웨어를 디자인했습니다. 우리는 먼저' CD' 인터페이스를 설계해야 한다. 그림과 같이:
[앞]
_ _ _ _ _ _ _ _ _ _ _ _ _ _
|<& gt|
| CD |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
|+Sell () |
| |
| _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ |
[/pre]
해적판 시디와 포르노는 그것의 하위 클래스이다. Kid 는' DiscFactory' 를 통해 이 CD 를 관리합니다. 코드: 공? 반? DiscFactory{public? 정전기? Getdisc (stringname) {return (disc) 클래스. Forname (이름) 입니다. New instance (); }} 해적판을 사고 싶어하는 사람이 있는데 어떻게 합니까? 공공? 반? Kid {public? 정전기? 무효화? 메인 (string []? Args){ CD? D? =? DiscFactory.getDisc (해적판 디스크); D.sell (); }} 만약 어느 날, 이 녀석은 양심이 발견되어 정품 소프트웨어를 팔기 시작했다. 괜찮습니다. "CD", "정품 소프트웨어" 의 하위 클래스를 만들기만 하면 됩니다. 기존 구조와 코드는 수정할 필요가 없습니다. 요즘 어떠세요? 확장에 개방하고, 수정에 폐쇄적인' 개방폐쇄원칙' 입니다.
공장 모델은 특정 제품을 확장하는 것으로, 일부 프로젝트는 더 많은 확장이 필요할 수 있습니다. 만약 우리가 이' 공장' 을 확대하려고 한다면, 그것은' 추상 공장' 이 될 것이다. 복합/합산 재사용 원칙 (CARP) 을 복합 재사용 원칙이라고 합니다. 조합/합산 재사용의 원칙은 새 객체에서 기존 객체를 사용하여 새 객체의 일부로 만드는 것입니다. 새 객체는 이러한 객체에 위임하여 기존 기능을 재사용하는 목적을 달성합니다. 디자인 원칙은 가능한 합성/수렴을 사용하고 가능한 한 상속을 사용하지 않는 것입니다.
상속을 적게 사용하고 합성 관계를 많이 활용해야 한다는 얘기다. 데이터베이스를 처리해야 할 클래스가 몇 개 있어서 데이터베이스를 조작하는 클래스를 썼고 데이터베이스를 처리하는 다른 모든 클래스는 이를 상속합니다. (데이비드 아셀, Northern Exposure (미국 TV 드라마), 데이터베이스명언) 그 결과, 데이터베이스 조작 클래스의 메서드를 수정했으며 모든 클래스를 변경해야 했습니다. "한 발 이끌고 온몸을 움직여!" 객체 지향은 파동을 가능한 작은 범위로 제한하는 것이다.
Java 에서는 클래스를 구현하는 대신 인터페이스를 프로그래밍하려고 노력해야 합니다. 이렇게 하면 하위 클래스를 대체해도 메서드를 호출하는 코드에는 영향을 주지 않습니다. 각 반이 가능한 한 다른 사람과 접촉하지 않도록 해라. "낯선 사람과 이야기하지 마라." 이렇게 성문의 불은 연못의 물고기를 다치게 하지 않을 것이다. 확장성과 서비스 기능을 향상시킬 수 있습니다. 디자인 패턴에는 ***23 의 세 가지 유형이 있습니다. 크리에이티브 모드: 단체 모드, 추상 공장, 생성자 모드, 공장 모드, 프로토타입 모드. 패브릭 모드: 어댑터 모드, 브리지 모드, 장식 모드, 콤보 모드, 모양 모드, 즐거움 모드 및 프록시 모드. 동작 모드: 템플릿 방법 모드, 명령 모드, 반복자 모드, 뷰어 모드, 중개자 모드, 메모 모드, 인터프리터 모드, 상태 모드, 정책 모드, 책임 체인 모드, 방문자 모드. 사전 순서에 따라 간단히 소개하면 다음과 같습니다.
추상 팩토리: 특정 클래스를 지정하지 않고 일련의 관련 또는 상호 종속 객체를 만들 수 있는 인터페이스를 제공합니다.
어댑터 모드: 한 클래스의 인터페이스를 고객이 원하는 다른 인터페이스로 변환합니다. 어댑터 모드를 사용하면 인터페이스가 호환되지 않아 함께 작동하지 않는 클래스가 함께 작동할 수 있습니다.
브리지: 추상 부분을 구현 부분에서 분리하여 둘 다 독립적으로 변경할 수 있습니다.
빌더 (builder mode): 복잡한 오브젝트의 빌드를 해당 표현에서 분리하므로 동일한 빌드 프로세스에서 다른 표현을 만들 수 있습니다.
권한 체인: 여러 객체가 요청을 처리할 수 있도록 요청의 발송자와 수신자를 분리합니다. 이러한 오브젝트를 체인으로 연결하고 오브젝트가 처리할 때까지 이 체인을 따라 요청을 전달합니다.
명령 모드: 요청을 하나의 개체로 캡슐화하여 고객의 다양한 요청을 매개변수화할 수 있습니다. 요청을 대기열에 넣거나 기록하고 취소할 수 있는 작업을 지원합니다.
복합 모드: 객체를 트리 구조로 그룹화하여 부분-전체 계층을 나타냅니다. 이를 통해 고객은 단일 객체와 복합 객체를 일관되게 사용할 수 있습니다.
장식 모드: 객체에 몇 가지 추가 책임을 동적으로 추가합니다. 확장 함수의 경우 하위 클래스를 생성하는 것보다 더 유연합니다.
Facade: 하위 시스템의 인터페이스 세트에 일관된 인터페이스를 제공합니다. Facade 스키마는 이 하위 시스템을 더 쉽게 사용할 수 있도록 고급 인터페이스를 정의합니다.
팩토리 메서드: 하위 클래스에서 인스턴스화할 클래스를 결정할 수 있도록 객체를 만드는 인터페이스를 정의합니다. 팩토리 메서드는 클래스의 인스턴스화를 하위 클래스로 지연시킵니다.
Flyweight (Enjoy 메타모드): * * * enjoy 기술을 사용하여 대량의 세밀한 객체를 효과적으로 지원합니다.
인터프리터 (인터프리터 모드): 언어를 지정하고, 해당 구문의 표현을 정의하고, 인터프리터가 해당 언어의 문장을 해석하는 데 사용하는 인터프리터를 정의합니다.
반복자 (반복자 모드): 객체의 내부 표현을 노출하지 않고 합산 객체의 요소에 순차적으로 액세스할 수 있는 방법을 제공합니다.
중개 (중개 모드): 중개 객체는 일련의 객체 상호 작용을 캡슐화하는 데 사용됩니다. 중개자는 객체를 명시적으로 상호 참조할 필요가 없도록 하여 커플링을 느슨하게 하고 상호 작용을 독립적으로 변경합니다.
Memento 모드: 캡슐화를 손상시키지 않고 오브젝트의 내부 상태를 캡처하여 오브젝트 외부에 저장합니다. 이렇게 하면 나중에 객체를 저장 상태로 복원할 수 있습니다.
관찰자 모드: 객체 간의 일대다 종속성을 정의하여 한 객체의 상태가 변경될 때 종속된 모든 객체가 공지를 받고 자동으로 새로 고쳐지도록 합니다.
프로토타입 모드: 프로토타입 인스턴스로 만들 객체의 종류를 지정하고 이 프로토타입을 복사하여 새 객체를 만듭니다.
프록시 모드: 다른 오브젝트에 대리자를 제공하여 해당 오브젝트에 대한 액세스를 제어합니다.
단일 인스턴스 모드: 클래스에 인스턴스가 하나만 있는지 확인하고 전역 액세스 포인트를 제공합니다. Singleton 모드는 가장 간단한 디자인 패턴 중 하나이지만 Java 개발자에게는 많은 결함이 있습니다. 9 월 칼럼에서 David Geary 는 단일 사례 패턴과 멀티스레드, 클래스 로더 및 직렬화 전에 이러한 결함을 처리하는 방법에 대해 논의했습니다.
상태 모드: 내부 상태가 변경될 때 오브젝트의 동작을 변경할 수 있습니다. 객체가 속한 클래스를 수정한 것 같습니다.
정책: 일련의 알고리즘, 즉 하나의 패키지를 정의하여 대체할 수 있도록 합니다. 이 모델은 알고리즘을 사용하는 고객과 독립적으로 알고리즘을 변경합니다.
템플릿 방법: 연산에서 알고리즘의 골격을 정의하고 일부 단계를 하위 클래스로 지연합니다. 템플릿 메서드를 사용하면 하위 클래스에서 알고리즘 구조를 변경하지 않고 알고리즘의 일부 단계를 재정의할 수 있습니다.
방문자 모드: 객체 구조의 각 요소에 적용되는 작업을 나타냅니다. 이를 통해 해당 클래스를 변경하지 않고 요소에 대한 새로운 작업을 정의할 수 있습니다.
다음 섹션부터 다음 각 설계 모드에 대해 자세히 설명합니다. 목적
하위 클래스가 인스턴스화할 클래스를 결정할 수 있도록 객체를 만드는 인터페이스를 정의합니다. 팩토리 메서드는 클래스의 인스턴스화를 하위 클래스로 지연시킵니다.
적용성 클래스가 만들어야 하는 객체의 클래스를 모르는 경우 클래스가 해당 하위 클래스에서 만드는 객체를 지정하길 원할 때. 클래스가 객체를 만드는 책임을 여러 도우미 하위 클래스 중 하나에 위임하고 어떤 도우미 하위 클래스가 프록시인지 현지화하려는 경우. 목적
특정 클래스를 지정하지 않고도 일련의 관련 또는 상호 종속 객체를 만들 수 있는 인터페이스를 제공합니다.
적용성 시스템은 제품의 생성, 조합 및 렌더링과 독립적이어야 합니다. 시스템이 여러 제품군 중 하나로 구성된 경우 공동 사용을 위해 일련의 관련 제품 대상의 디자인을 강조하고 싶을 때. 제품 클래스 라이브러리를 제공할 때, 구현이 아닌 인터페이스만 보여주고 싶을 때. (존 F. 케네디, 컴퓨터명언) 목적
복잡한 객체의 구성을 해당 표현과 분리하면 동일한 구성 프로세스에서 다른 표현을 만들 수 있습니다.
복잡한 개체를 생성하는 데 사용되는 알고리즘은 개체의 어셈블리와 어셈블되는 방법의 적용 가능성과 독립적이어야 합니다. 구성 프로세스에서 구성 객체의 다른 표현을 허용해야 하는 경우 목적
프로토타입 인스턴스를 사용하여 만들 객체의 종류를 지정하고 이러한 프로토타입을 복사하여 새 객체를 만듭니다.
인스턴스화할 클래스가 런타임 시 지정된 경우 적용 가능성 (예: 동적 로드 사용) 또는 제품 클래스 계층과 평행한 팩토리 클래스 계층을 작성하지 마십시오. 또는 클래스의 인스턴스는 여러 가지 상태 조합 중 하나만 가질 수 있습니다. 적절한 수의 프로토타입을 만들고 복제하는 것이 매번 적절한 상태로 클래스를 수동으로 인스턴스화하는 것보다 편리할 수 있습니다. 목적
클래스에 인스턴스가 하나만 있는지 확인하고 해당 인스턴스에 액세스할 수 있는 전역 액세스 지점을 제공합니다.
클래스에 하나의 인스턴스만 있을 수 있고 고객이 잘 알려진 액세스 포인트에서 액세스할 수 있는 경우의 적용 가능성. 이 고유한 인스턴스가 하위 클래스로 확장되어야 하는 경우 고객은 코드를 변경하지 않고 확장된 인스턴스를 사용할 수 있어야 합니다. 목적
한 클래스의 인터페이스를 고객이 원하는 다른 인터페이스로 변환합니다. 어댑터 모드를 사용하면 인터페이스가 호환되지 않아 함께 작동하지 않는 클래스가 함께 작동할 수 있습니다.
적용성 기존 클래스를 사용하려고 하지만 해당 인터페이스가 요구 사항에 맞지 않습니다. 다른 관련이 없거나 예측할 수 없는 클래스 (즉, 인터페이스가 호환되지 않을 수 있는 클래스) 와 함께 작동하는 재사용 가능한 클래스를 만들 수 있습니다. (객체 어댑터만 해당) 일부 기존 하위 클래스를 사용하려고 하지만 각 하위 클래스를 인터페이스에 맞게 조정할 수는 없습니다. 객체 어댑터는 상위 클래스 인터페이스를 조정할 수 있습니다. 목적
추상 부분을 구현 부분과 분리하여 독립적으로 변경할 수 있습니다.
적용성 추상화와 구현 사이에 고정 바인딩 관계를 원하지 않습니다. 예를 들어, 프로그램이 실행 중일 때 구현 부분을 선택하거나 전환할 수 있어야 하기 때문일 수 있습니다. 클래스의 추상화와 구현은 하위 클래스를 생성하여 확장해야 합니다. 이 시점에서 B r I d g e 모드를 사용하면 서로 다른 추상 인터페이스와 구현 부분을 결합하여 개별적으로 확장할 수 있습니다. 추상 구현 부분의 수정은 고객에게 영향을 주지 않아야 합니다. 즉, 고객의 코드를 다시 컴파일할 필요가 없습니다. (C++) 고객에게 추상 구현 부분을 완전히 숨기고 싶습니다. C++ 에서 클래스 표현은 클래스 인터페이스에서 볼 수 있습니다. 생성할 클래스가 많이 있습니다. 이러한 클래스 계층은 객체를 두 부분으로 분할해야 한다는 것을 의미합니다. Rumbaugh 에서는 이러한 클래스 계층을 "중첩 요약" 이라고 합니다. * * * 여러 객체 간에 구현을 공유하고자 하지만 (참조 수를 사용할 수 있음) 고객에게 이를 알지 말라고 요청합니다. 간단한 예는 여러 객체가 * * * 동일한 문자열 표현 (Stringrep) 을 즐길 수 있는 Coplien 의 string 클래스입니다. 목적
객체를 트리 구조로 그룹화하여 부분-전체 계층을 나타냅니다. C, o, p, o, s, I, t, e 를 통해 사용자는 단일 객체와 결합된 객체를 일관되게 사용할 수 있습니다.
적용성 객체의 일부인 전체 계층을 표현하고자 합니다. 사용자가 결합된 객체와 개별 객체의 차이를 무시하기를 원합니다. 사용자는 결합된 구조의 모든 객체를 일관되게 사용합니다. 목적
동적으로 대상에 몇 가지 추가 책임을 추가합니다. 함수를 추가할 때 데코레이터 모드는 하위 클래스를 생성하는 것보다 더 유연합니다.
적용성은 다른 객체에 영향을 주지 않고 동적이고 투명한 방식으로 개별 객체에 책임을 추가합니다. 취소할 수 있는 책임을 처리하다. 하위 클래스를 생성하여 확장할 수 없을 때 한 가지 경우 많은 수의 독립 확장이 있을 수 있으며 각 조합을 지원하는 많은 하위 클래스가 생성되어 하위 클래스의 수가 폭발적으로 증가할 수 있습니다. 또 다른 경우는 클래스 정의가 숨겨져 있거나 클래스 정의를 사용하여 하위 클래스를 생성할 수 없기 때문일 수 있습니다. 목적
서브시스템의 인터페이스 세트에 일관된 인터페이스를 제공합니다. Facade 스키마는 하위 시스템을 쉽게 사용할 수 있도록 고급 인터페이스를 정의합니다.
적용성 복잡한 하위 시스템에 간단한 인터페이스를 제공하고자 할 때. 하위 시스템은 끊임없이 진화하여 점점 더 복잡해지는 경향이 있다. 대부분의 모드는 사용할 때 더 작은 클래스를 생성합니다. 이로 인해 하위 시스템의 재사용성이 향상되고 사용자 정의가 쉬워지지만 하위 시스템을 사용자 정의할 필요가 없는 사용자에게는 몇 가지 어려움이 있습니다. Facade 는 대부분의 사용자에게 충분한 간단한 기본 뷰를 제공하며 더 많은 사용자 정의가 필요한 사용자는 Facade 계층을 능가할 수 있습니다. 클라이언트 프로그램과 추상 클래스의 구현 부분은 매우 의존적입니다. Facade 를 도입하여 이 하위 시스템을 고객과 다른 하위 시스템에서 분리하면 하위 시스템의 독립성과 이식성이 향상됩니다. 계층 하위 시스템을 구축해야 하는 경우 facade 모드를 사용하여 하위 시스템의 각 계층에 대한 진입점을 정의합니다. 하위 시스템이 상호 의존적인 경우 Facade 를 통해서만 통신하도록 하여 하위 시스템 간의 종속성을 단순화할 수 있습니다. 목적
* * * enjoy 기술을 사용하여 대량의 세밀한 객체를 효과적으로 지원합니다.
응용 프로그램은 많은 수의 객체를 사용합니다. 대량의 개체를 사용했기 때문에, 많은 스토리지 오버헤드가 발생하였다. 객체의 대부분의 상태를 외부 상태로 변경할 수 있습니다. 한 오브젝트의 외부 상태를 삭제하면 많은 오브젝트 그룹을 비교적 적은 * * * 오브젝트로 바꿀 수 있습니다. 이 응용 프로그램은 객체 인식에 의존하지 않습니다. Flyweight 객체는 * * * 일 수 있기 때문에 개념적으로 상당히 다른 객체에 대해 인식 테스트는 true 값을 반환합니다. 목적
다른 객체에 대한 액세스를 제어하는 프록시를 제공합니다.
적응성
단순 포인터를 보다 일반적이고 복잡한 오브젝트 포인터로 대체해야 하는 경우 프록시 모드를 사용합니다. 프록시 모드를 사용할 수 있는 몇 가지 일반적인 경우는 다음과 같습니다. 원격 에이전트는 서로 다른 주소 공간에 있는 객체에 대한 로컬 표현을 제공합니다. 가상 에이전트는 필요에 따라 비싼 개체를 만듭니다. 보호 에이전트는 원본 객체에 대한 액세스를 제어합니다. 객체에 서로 다른 액세스 권한이 있어야 하는 경우 보호 에이전트를 사용합니다. 스마트 참조는 객체에 액세스할 때 몇 가지 추가 작업을 수행하는 단순 포인터를 대체합니다. 일반적으로 실제 객체에 대한 참조를 집계하여 객체에 참조가 없을 때 자동으로 해제 (SmartPointers 라고도 함) 할 수 있습니다. 영구 객체가 처음 참조될 때 메모리에 로드됩니다. 실제 객체에 액세스하기 전에 객체가 잠겨 있는지 확인하여 다른 객체가 변경할 수 없도록 합니다. 목적
여러 객체에 요청을 처리할 수 있는 기회를 제공하여 요청의 발신자와 수신자 간의 결합 관계를 방지합니다. 이러한 오브젝트를 체인으로 연결하고 오브젝트가 처리할 때까지 이 체인을 따라 요청을 전달합니다.
적용성 요청을 처리할 수 있는 객체가 여러 개 있으며, 요청 런타임을 처리하는 객체는 자동으로 결정됩니다. 수신자를 명시적으로 지정하지 않고 여러 객체 중 하나에 요청을 제출하려고 합니다. 요청을 처리할 수 있는 객체 세트를 동적으로 지정해야 합니다. 목적
요청을 하나의 개체로 캡슐화하여 서로 다른 요청을 하는 고객을 매개변수화할 수 있습니다. 요청을 대기열에 넣거나 기록하고 취소할 수 있는 작업을 지원합니다.
적용성은 위에서 설명한 MenuItem 객체와 마찬가지로 파라메트릭 객체를 위해 수행할 작업을 추상화합니다. 프로세스 언어의 콜백 함수를 사용하여 이 파라메트릭 메커니즘을 표현할 수 있습니다. 콜백 함수란 먼저 함수를 어딘가에 등록하고 나중에 필요할 때 호출하는 것이다. 명령 모드는 콜백 메커니즘의 객체 지향 대안입니다. 서로 다른 시간에 대한 요청을 지정, 예약 및 실행합니다. 명령 객체의 수명은 초기 요청과 독립할 수 있습니다. 요청 수신자가 주소 공간과 별도로 표현할 수 있는 경우 해당 요청을 담당하는 명령 객체를 다른 프로세스로 전송할 수 있으며 해당 요청을 구현할 수 있습니다. 취소 작업이 지원됩니다. Command 의 Execute 작업은 작업이 취소될 때 작업의 영향을 제거하기 위해 사용되는 작업 구현 전 상태를 저장할 수 있습니다. 실행 작업을 명령 인터페이스에 추가해야 합니다. 그러면 마지막 실행 호출의 효과가 취소됩니다. 실행된 명령은 내역 리스트에 저장됩니다. 이 목록을 앞뒤로 순회하고 각각 UnExecute 및 Execute 를 호출하여 제한 없이 "취소" 및 "다시 실행" 할 수 있습니다. 시스템 충돌 시 수정 사항을 복구할 수 있도록 수정 로그를 지원합니다. 명령 인터페이스에 로드 및 저장 작업을 추가하여 일관된 변경 수정 로그를 유지하는 데 사용할 수 있습니다. 충돌에서 복구하는 프로세스에는 디스크에서 레코드를 다시 읽고 실행 작업을 사용하여 다시 실행하는 명령이 포함됩니다. 원래 작업을 기반으로 한 고급 작업으로 시스템을 구축합니다. 이 구조는 트랜잭션을 지원하는 정보 시스템에서 흔히 볼 수 있다. 트랜잭션은 데이터에 대한 변경 사항 집합을 캡슐화합니다. 명령 모드는 트랜잭션을 모델링하는 방법을 제공합니다. 명령에는 공용 인터페이스가 있으므로 모든 트랜잭션을 같은 방식으로 호출할 수 있습니다. 또한 이 모드를 사용하면 시스템을 확장하기 위해 새로운 트랜잭션을 쉽게 추가할 수 있습니다. 목적
언어를 지정하고, 해당 구문의 표현을 정의하고, 인터프리터가 해당 언어의 문장을 해석하는 데 사용하는 인터프리터를 정의합니다.
적용성 해석과 실행이 필요한 언어가 있고, 언어의 문장을 추상적인 문법 트리로 표현할 수 있을 때 인터프리터 모드를 사용할 수 있다. 이 모델은 구문이 간단하고, 구문의 클래스 계층이 커지고, 복잡한 구문에는 관리하기가 어려운 경우에 가장 효과적입니다. 이때 분석기 생성기와 같은 도구가 좋은 선택이다. 추상 구문 트리를 작성하지 않고도 표현식을 해석할 수 있으므로 공간과 시간을 절약할 수 있습니다. 효율성은 중요한 문제가 아니다. 가장 효과적인 인터프리터는 일반적으로 구문 분석 트리를 직접 해석하지 않고 먼저 다른 형식으로 변환합니다. 예를 들어, 일반 표현식은 일반적으로 상태 시스템으로 변환됩니다. 그러나 이 경우에도 인터프리터 모드에서 변환기를 구현할 수 있습니다. 이는 여전히 유용합니다. 목적
객체의 내부 표현을 공개하지 않고 합산 객체의 요소에 순차적으로 액세스하는 방법을 제공합니다.
적용성은 내부 표현을 노출하지 않고 클러스터된 오브젝트의 내용에 액세스합니다. 합산 객체의 다중 트래버스 지원. 다양한 집계 구조를 트래버스할 수 있는 통합 인터페이스 (즉, 다형성 반복 지원) 를 제공합니다. 목적
중개 객체로 일련의 객체 상호 작용을 캡슐화하다. 중개자는 객체를 명시적으로 상호 참조할 필요가 없도록 하여 커플링을 느슨하게 하고 상호 작용을 독립적으로 변경합니다.
적용성 객체 그룹은 명확하고 복잡한 방식으로 통신합니다. 이로 인한 상호 의존은 혼란스럽고 이해하기 어렵다. 한 오브젝트가 다른 많은 오브젝트를 참조하고 직접 통신하므로 해당 오브젝트를 재사용하기가 어렵습니다. 여러 클래스에 분산되는 동작을 사용자 정의하려고 하지만 하위 클래스를 너무 많이 생성하지는 않습니다. 목적
오브젝트의 내부 상태를 캡처하여 패키지를 손상시키지 않고 오브젝트 외부에 저장합니다. 이렇게 하면 나중에 객체를 저장 상태로 복원할 수 있습니다.
적용성은 나중에 필요할 때 이전 상태로 되돌릴 수 있도록 특정 시점의 객체 (부분) 상태를 유지해야 합니다. 한 사람이 인터페이스를 사용하여 다른 오브젝트가 이러한 상태를 직접 얻을 수 있도록 하면 오브젝트의 구현 세부 사항이 노출되고 오브젝트의 캡슐화가 손상됩니다. 목적
객체 간의 일대다 종속성을 정의합니다. 객체의 상태가 변경되면 해당 객체에 종속된 모든 객체가 공지되고 자동으로 업데이트됩니다.
하나의 추상 모델에 두 가지 측면이 있는데, 하나는 다른 하나의 적합성에 의존한다. 독립적으로 변경하고 재사용할 수 있도록 두 오브젝트를 별도의 오브젝트로 캡슐화합니다. 한 객체를 변경해야 할 때 동시에 다른 객체를 변경해야 하는 경우 변경해야 할 객체 수를 알 수 없습니다. 한 객체가 다른 객체에 알려야 하는 경우 다른 객체가 누구라고 가정할 수 없습니다. 즉, 이러한 오브젝트가 밀접하게 결합되는 것을 원하지 않습니다. 목적
내부 상태가 변경될 때 오브젝트의 동작을 변경할 수 있습니다. 객체가 해당 클래스를 수정한 것 같습니다.
적용성 개체의 동작은 해당 상태에 따라 다르며 런타임 상태에 따라 동작을 변경해야 합니다. 작업에는 객체의 상태에 따라 달라지는 거대한 다중 분기 조건문이 포함됩니다. 이 상태는 일반적으로 하나 이상의 열거 상수로 표시됩니다. 일반적으로 동일한 조건 구조를 포함하는 작업이 여러 개 있습니다. 상태 모드는 각 조건 분기를 별도의 클래스에 배치합니다. 이렇게 하면 자신의 상황에 따라 한 개체의 상태를 하나의 개체로 볼 수 있습니다. 이 개체는 다른 개체에 의존하지 않고 독립적으로 변경할 수 있습니다. 목적
일련의 알고리즘, 즉 하나의 패키지를 정의하여 대체할 수 있도록 합니다. 이 모델을 사용하면 알고리즘을 사용하는 고객과 독립적으로 알고리즘을 변경할 수 있습니다.
적용 가능성과 관련된 많은 클래스는 단지 행동이 다를 뿐이다. 정책은 여러 동작 중 하나로 클래스를 구성하는 방법을 제공합니다. 너는 알고리즘의 다른 변형을 사용해야 한다. 예를 들어, 서로 다른 공간/시간 균형을 반영하는 알고리즘을 정의할 수 있습니다. 이러한 변형을 알고리즘의 클래스 계층으로 구현할 때 정책 모드를 사용할 수 있습니다. 알고리즘은 고객이 알아야 할 데이터를 사용합니다. 정책 모드는 복잡한 알고리즘과 관련된 데이터 구조의 노출을 방지하는 데 사용할 수 있습니다. 한 클래스는 이 클래스의 작업에서 여러 조건문으로 나타나는 다양한 비헤이비어를 정의합니다. 관련 조건 분기를 해당 정책 클래스로 이동하여 이러한 조건문을 대체합니다. 목적
연산에서 알고리즘의 뼈대를 정의하여 일부 단계를 하위 클래스로 지연시킵니다. Te m p l a t e M e t h o d 를 사용하면 하위 클래스가 알고리즘 구조를 변경하지 않고 알고리즘의 일부 단계를 재정의할 수 있습니다.
적용성은 한 번에 하나의 알고리즘에서 변할 수 없는 부분을 실현하고, 변화할 수 있는 동작을 하위 클래스에 남겨둡니다. 각 하위 클래스에서 남성 * * * 의 동작을 추출하여 한 남자 * * * 상위 클래스에 집중하여 코드 중복을 방지해야 합니다. 이것은 오프다이크와 존슨이 묘사한' 요약으로 분해' 의 좋은 예이다. 먼저 기존 코드의 차이를 식별하고 차이를 새 작업으로 분리합니다. 마지막으로 이러한 다른 코드를 이러한 새 작업을 호출하는 템플릿 메서드로 바꿉니다. 컨트롤 하위 클래스 확장 템플릿 메서드는 특정 지점에서만 후크 작업을 호출하고 해당 지점에서만 확장할 수 있습니다. 목적
객체 구조에서 작동하는 요소를 나타내는 작업입니다. 이를 통해 해당 클래스를 변경하지 않고 요소에 대한 새로운 작업을 정의할 수 있습니다.
적용성 하나의 객체 구조에는 서로 다른 인터페이스를 가진 많은 클래스 객체가 포함되어 있으며, 이러한 특정 클래스에 의존하는 객체에 대해 몇 가지 작업을 수행하려고 합니다. 한 오브젝트 구조의 오브젝트에 대해 서로 다르고 관련이 없는 많은 작업을 수행해야 하며 이러한 작업이 해당 오브젝트의 클래스를 "오염" 하지 않도록 해야 합니다. Visitor 를 사용하면 관련 작업을 중앙 집중화하고 한 클래스에서 정의할 수 있습니다. 객체 구조가 여러 응용 프로그램에서 공유되는 경우 방문자 모드를 사용하여 각 응용 프로그램에 필요한 작업만 포함되도록 합니다. 객체 구조를 정의하는 클래스는 거의 변경되지 않지만 이 구조에 대해 새로운 작업을 정의해야 하는 경우가 많습니다. 객체 구조 클래스를 변경하려면 모든 방문자에 대한 인터페이스를 재정의해야 하므로 비용이 많이 들 수 있습니다. 객체 구조 클래스가 자주 변경되는 경우 이러한 클래스에서 이러한 작업을 정의하는 것이 좋습니다.