구조 모델 (II) 장식 패턴 (데코레이터 패턴)

동기 부여 (동기 부여)

어떻게 필요 달성하기 위해 (즉, 런타임) 동적 일 수있다 "확장 객체 함수"를 만드는 방법? 회피하면서 "증가하는 확장 된 기능을"서브 클래스 확장 문제가 발생? 그래야으로 인한 "기능 확장과 변화"의 영향은 최소로 감소?

의도 (의도)

객체에 동적으로 추가적인 책임을 추가 할 수 있습니다. 증가 된 기능에, 실내 장식 패턴은 서브 클래스보다 더 유연하다. - "디자인 패턴"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를 (); 
    } 
}

하이라이트 장식 패턴을 실현 :

  1. 기술들의 조합을 이용함으로써, 실내 장식 패턴 동적 런타임 객체 성장 기능을 달성하기 위해, 상속 및 원하는 정보의 복수의 기능을 할 수 없다. 별도의 상속의 사용을 방지하는 것은 "유연성"과 "멀티 서브 클래스 파급 효과를."주는
  2. 추상 데코레이터 모드의 인터페이스로 구성 요소 클래스 행위, 특정 동작을 달성하기 위해해서는 안됩니다. 그리고 구성 요소 클래스에 대한 데코레이터 클래스는 투명해야한다 - 즉 데코레이터 클래스를 알 수없는 구성 요소 클래스는 데코레이터 클래스는 외부에서 구성 요소 클래스의 기능을 확장하는 것입니다.
  3. 장식 클래스 상속 관계 부품, 즉 장식 클래스가 컴포넌트 클래스가 인터페이스에 대한 인터페이스를 상속-A가 나타난다. 그러나 관련 성능의 조합으로 구현하고있다-구성 요소, 즉 데코레이터 차례는 다른 구성 요소 클래스를 사용합니다. 우리는 구성 요소 객체를 "장식"하나 개 이상의 데코레이터 객체를 사용할 수 있으며, 장식 후 개체가 아직 구성 요소 개체입니다.
  4. "장식"수단 - 장식 패턴이 문제점은 "다중 상속 유래 다중 서브 클래스"를 해결할 수없는, 장식 모드 애플리케이션의 요지는 "다중 방향으로 주요 클래스 확장"을 해결하는 것이다.

장점 장식 패턴 :

  1. 구현에서 추상 인터페이스를 분리.
  2. 추상 및 달성 할 수있는 독립 확장은 서로 영향을주지 않습니다.
  3. 클라이언트에 투명 구현 세부 사항은 특정 구현 세부 사항을 숨기는 데 사용합니다.

단점의 장식 패턴 :

  1. 그것은 시스템의 복잡성을 증가

브리지 모드는 다음과 같은 경우에 사용되어야한다 :

  1. 시스템이 역할의 추상적이고 구체적인 역할 구성원 사이에 더 많은 유연성을 추가 할 필요가있는 경우, 두 레벨 사이의 정적 빌드 링크를 방지 할 수 있습니다.
  2. 클라이언트의 역할에 영향을 미치는, 또는 클라이언트의 역할의 변화에 ​​영향을주지해야한다 변화를 달성하기 위해 설계 요구 사항은 완전 투명합니다.
  3. 우리는 여러 플랫폼의 그래픽과 윈도우 시스템을 통과해야합니다.
  4. 클래스 변경은 두 개의 독립적 인 측정 기준이 존재하고, 두 치수는 확장 될 필요가있다.

넷째, .NET 장식 패턴을 구현

    넷 프레임 워크에서 "장식 패턴"의 명백한 사용의 유형이있다, 이런 종류의 스트림입니다. 스트림 유형은 System.IO 네임 스페이스 내에서 추상적 인 인터페이스, 실제로 구성 요소입니다. 하여 FileStream은,는 NetworkStream은 MemoryStream을 엔티티 클래스 ConcreteComponent입니다. 스트림 인터페이스를 상속 권리, CryptoStream을 장식 개체를 한 BufferedStream.

   도표 :

    스트림 구성 요소에 해당, 장식 개체의 정의,하여 FileStream 개체, 한 BufferedStream 장식용 물건을 장식하는 것입니다. 우리는 부분적으로 정의, 정의 한 BufferedStream 봐.

공공  봉인  클래스 한 BufferedStream : 스트림 
 { 
    개인  CONST의  INT _DefaultBufferSize = 4096 ; 
    개인 스트림 _stream; 
}

추천

출처www.cnblogs.com/springsnow/p/11310438.html