동기 부여 (동기 부여)
어떻게 필요 달성하기 위해 (즉, 런타임) 동적 일 수있다 "확장 객체 함수"를 만드는 방법? 회피하면서 "증가하는 확장 된 기능을"서브 클래스 확장 문제가 발생? 그래야으로 인한 "기능 확장과 변화"의 영향은 최소로 감소?
의도 (의도)
객체에 동적으로 추가적인 책임을 추가 할 수 있습니다. 증가 된 기능에, 실내 장식 패턴은 서브 클래스보다 더 유연하다. - "디자인 패턴"GoF의
도 구조 (구조)
구성 모드
장식 패턴에서 다양한 역할은 다음과 같습니다
(1), 추상적 인 구성 요소 문자 (구성 요소) : 추상적 인 인터페이스를 제공 추가 책임을 수신 할 준비가 조절 할 수 있습니다.
(2), 특정 구성 요소의 역할 (구성 요소 콘크리트) : 클래스의 정의는 추가 책임을받을 수 있습니다.
(3) 장식 역할 (데코레이터) : 객체의 구성 요소 (구성 요소) 인스턴스 및 일관된 인터페이스를 유지하는 추상 멤버와 인터페이스합니다.
(4) 특정 장식 역할 (콘크리트 데코레이터) : 구성 요소 개체에 대한 책임은 추가적인 책임에 추가됩니다.
응용 프로그램 :
/// <요약> /// 이 추상 클래스는 구성 요소 유형을 입력하는 것과 같습니다 집에 정의 된 추상적 인 인터페이스입니다, 만두, 포장하는, 장식 할 것입니다 /// </ 요약> 공공 추상 클래스 하우스 { 공공 추상적 무효 업데이트 (); // 집 장식 방법 - 이것은 구성 요소의 조작 방법의 유형에 해당 } /// <요약> /// 유형 데코레이터를 입력하는 것과 동일 인터페이스 장식, 정의이 추상 클래스 특정 기능을 필요한 경우 이러한 유형의 하위 클래스 /// </ 요약> 공공 추상 클래스 DecorationStrategy을 : 하우스 // 키 비스 관계를 반영하는 것은-A이 관계를 가지고 즉, 클래스를 장식 할 수있다 장식 계속 { // 이러한 유형의 특정 실시 예를 높이기 위해, 조합에 의해 참조 데코레이터 유형 것은-했습니다 구현이 시점, 포함 관계의 주요 기능 중 하나입니다 보호_House 집; 보호 DecorationStrategy (하우스 하우스) // 생성자 주입함으로써 플랫폼 초기화 { 이 본 ._house = 집; } 공개 오버라이드 공극 개조는 () // 이 방법은 운전 방식 데코의 유형에 해당 { IF ( 은이 . ! _house = 널 (null) ) { 다음은이 ._house.Renovation (); } } } /// <요약> /// PatrickLiu 하우스, 나는 ConcreteComponent 유형에 해당하는 주택을 할 내 요청을 누르면 것, 이것이 우리의 특정 만두입니다 소, 나는 개인적으로 부추 소를 선호 /// </ 요약> 공개 봉인 클래스 MyHouse : 하우스 { 공공 재정의 무효 혁신 () { Console.WriteLine ( " 장식 PatrickLiu 집 " ); } } /// <요약> /// 장치, 보안 기능을 가진 기능을 모니터링 및 알람 아니라, 제공 될 수있다 ConcreteDecoratorA 타입 /// </ 요약> 공공 봉인 클래스 DecorationStrategy : HouseSecurityDecorator { 공공 HouseSecurityDecorator (하우스 하우스) : 자료 (하우스) {} 공공 재정의 무효 혁신 () { 자료.Renovation (); Console.WriteLine ( " 증가 된 안전 시스템 " ); } } /// <요약> /// 단열재 인터페이스를 갖는, ConcreteDecoratorB 유형에 대응하는 단열 기능을 제공 /// </ 요약> 공중 봉인 클래스 KeepWarmDecorator : DecorationStrategy { 공공 KeepWarmDecorator (하우스 하우스) : 자료 (하우스) {} 공공 재정의 무효 혁신 () { 자료 .Renovation (); Console.WriteLine ( " 절연 기능을 증가 " ); } } 공개 클래스 프로그램 { 정적 무효 메인 () { 하우스 myselfHouse = 새로운 새로운 MyHouse (); // 이것은 우리의 만두 집 장식 할 필요가있다 DecorationStrategy securityHouse = 새로운 새로운 HouseSecurityDecorator (myselfHouse를) securityHouse.Renovation (); // 이 집 보안 시스템은 // 내가 따뜻하게해야하는 경우 모두 보안 시스템은 라인에 장식 계속 않습니다 DecorationStrategy securityAndWarmHouse = 새로운 새로운 HouseSecurityDecorator (securityHouse) securityAndWarmHouse.Renovation를 (); } }
하이라이트 장식 패턴을 실현 :
- 기술들의 조합을 이용함으로써, 실내 장식 패턴 동적 런타임 객체 성장 기능을 달성하기 위해, 상속 및 원하는 정보의 복수의 기능을 할 수 없다. 별도의 상속의 사용을 방지하는 것은 "유연성"과 "멀티 서브 클래스 파급 효과를."주는
- 추상 데코레이터 모드의 인터페이스로 구성 요소 클래스 행위, 특정 동작을 달성하기 위해해서는 안됩니다. 그리고 구성 요소 클래스에 대한 데코레이터 클래스는 투명해야한다 - 즉 데코레이터 클래스를 알 수없는 구성 요소 클래스는 데코레이터 클래스는 외부에서 구성 요소 클래스의 기능을 확장하는 것입니다.
- 장식 클래스 상속 관계 부품, 즉 장식 클래스가 컴포넌트 클래스가 인터페이스에 대한 인터페이스를 상속-A가 나타난다. 그러나 관련 성능의 조합으로 구현하고있다-구성 요소, 즉 데코레이터 차례는 다른 구성 요소 클래스를 사용합니다. 우리는 구성 요소 객체를 "장식"하나 개 이상의 데코레이터 객체를 사용할 수 있으며, 장식 후 개체가 아직 구성 요소 개체입니다.
- "장식"수단 - 장식 패턴이 문제점은 "다중 상속 유래 다중 서브 클래스"를 해결할 수없는, 장식 모드 애플리케이션의 요지는 "다중 방향으로 주요 클래스 확장"을 해결하는 것이다.
장점 장식 패턴 :
- 구현에서 추상 인터페이스를 분리.
- 추상 및 달성 할 수있는 독립 확장은 서로 영향을주지 않습니다.
- 클라이언트에 투명 구현 세부 사항은 특정 구현 세부 사항을 숨기는 데 사용합니다.
단점의 장식 패턴 :
- 그것은 시스템의 복잡성을 증가
브리지 모드는 다음과 같은 경우에 사용되어야한다 :
- 시스템이 역할의 추상적이고 구체적인 역할 구성원 사이에 더 많은 유연성을 추가 할 필요가있는 경우, 두 레벨 사이의 정적 빌드 링크를 방지 할 수 있습니다.
- 클라이언트의 역할에 영향을 미치는, 또는 클라이언트의 역할의 변화에 영향을주지해야한다 변화를 달성하기 위해 설계 요구 사항은 완전 투명합니다.
- 우리는 여러 플랫폼의 그래픽과 윈도우 시스템을 통과해야합니다.
- 클래스 변경은 두 개의 독립적 인 측정 기준이 존재하고, 두 치수는 확장 될 필요가있다.
넷째, .NET 장식 패턴을 구현
넷 프레임 워크에서 "장식 패턴"의 명백한 사용의 유형이있다, 이런 종류의 스트림입니다. 스트림 유형은 System.IO 네임 스페이스 내에서 추상적 인 인터페이스, 실제로 구성 요소입니다. 하여 FileStream은,는 NetworkStream은 MemoryStream을 엔티티 클래스 ConcreteComponent입니다. 스트림 인터페이스를 상속 권리, CryptoStream을 장식 개체를 한 BufferedStream.
도표 :
스트림 구성 요소에 해당, 장식 개체의 정의,하여 FileStream 개체, 한 BufferedStream 장식용 물건을 장식하는 것입니다. 우리는 부분적으로 정의, 정의 한 BufferedStream 봐.
공공 봉인 클래스 한 BufferedStream : 스트림 { 개인 CONST의 INT _DefaultBufferSize = 4096 ; 개인 스트림 _stream; }