C\#디자인 모델 시리즈 튜 토리 얼-장식 모델

1.개술
동태 적 으로 한 대상 에 게 추가 적 인 직책 을 추가 하면 기능 을 증가 하 는 데 있어 장식 모델 은 하위 클래스 를 생 성 하 는 것 보다 더욱 유연 하 다.
원리:수식 류 를 추가 하여 원래 의 종 류 를 감 싸 는 방식 은 일반적으로 원래 의 대상 을 수식 류 의 구조 함수 로 하 는 매개 변수 이다.장식 류 는 새로운 기능 을 실현 하지만 새로운 기능 을 사용 하지 않 아 도 되 는 곳 에서 원래 의 유형 중의 방법 을 직접 호출 할 수 있다.수식 류 는 반드시 원래 의 종류 와 같은 인터페이스 가 있어 야 한다.
2.모드 속 캐릭터
2.1 추상 적 인 구축(Component):추상 적 인 인 터 페 이 스 를 정의 하여 이 대상 에 게 동적 으로 직책 을 추가 하도록 한다.
2.2 구체 적 인 구축(Concrete Component):구체 적 인 대상 을 정의 하고 이 대상 에 게 직책 을 추가 할 수 있다.
2.3 장식 류(Decorator):장식 추상 류 는 Component 를 계승 하고 외부 에서 Component 류 의 기능 을 확대 한다.
2.4 구체 적 인 장식 자(Concretor Decorator):구축 대상 에 직책 을 추가 하 는 것 을 책임 진다.
3.패턴 판독
3.1 장식 모델 의 일반화 유형 도
//img.jbzj.com/file_images/article/201606/2016060111392629.png
3.2 장식 모드 의 일반화 코드

 /// <summary>
 ///         ,              
 /// </summary>
 public abstract class Component
 {
  public abstract void Opration();
 }

 /// <summary>
 ///     
 /// </summary>
 public class ConcreteComponent:Component
 {

  public override void Opration()
  {
   //        
  }
 }

 /// <summary>
 ///       ,        。
 /// </summary>
 public abstract class Decorator:Component
 {
  protected Component component;

  /// <summary>
  ///   Component
  /// </summary>
  /// <param name="component"></param>
  public void SetComponent(Component component)
  {
   this.component = component;
  }

  /// <summary>
  ///   Operation,      Component Operation。
  /// </summary>
  public override void Opration()
  {
   if (component != null)
   {
    component.Opration();
   }
  }
 }

 public class ConcreteDecoratorA : Decorator
 {
  private void SpecialOpration()
  {
   //        
  }

  public override void Opration()
  {
   //     Component Operation(),        ,     Component     
   base.Opration();

   this.SpecialOpration();
  }
 }

 public class ConcreteDecoratorB : Decorator
 {
  private void SpecialOprationA()
  {
   //         A
  }

  private void SpecialOprationB()
  {
   //         B
  }

  public override void Opration()
  {
   //     Component Operation(),        ,     Component     
   base.Opration();

   this.SpecialOprationA();
   this.SpecialOprationB();
  }
 }

4.모델 총화
4.1 장점
4.1.1 모든 장식 대상 은 자신의 기능 에 만 관심 을 가지 고 대상 체인 에 어떻게 추가 되 는 지 에 관심 을 가 질 필요 가 없다.그것 은 Decorator 의 SetComponent 방법 으로 이 루어 지기 때문에 그들의 직책 은 단일 하 다.
4.1.2 류 의 핵심 직책 과 동태 적 으로 추 가 된 직책 은 분리 된다.만약 에 주 류 에 새로운 기능 을 추가 하면 하 나 는 개방 폐쇄 원칙 을 위반 하고 다른 하 나 는 주 류 의 복잡 도 를 증가 하 는 것 이다.
4.1.3 정적 계승 보다 유연 하고 대상 의 정적 계승 에 비해 Decorator 모델 은 대상 에 게 더욱 유연 하 게 직책 을 추가 하 는 방식 을 제공 하고 추가 와 분리 하 는 방법 을 사용 하여 운영 시간 에 장식 으로 직책 을 증가 하고 삭제 할 수 있다.
4.2 단점
4.2.1 많은 작은 대상 이 생기 고 Decorator 모델 로 시스템 디자인 을 하면 비슷 해 보 이 는 작은 대상 이 많이 생 긴 다.이런 대상 들 은 서로 연결 하 는 방식 만 다르다.
4.3 적용 필드
4.3.1 기 존 기능 에 더 많은 기능 을 동적 으로 추가 해 야 할 때.
4.3.2 류 의 핵심 기능 은 바 꿀 필요 가 없고 새로운 기능 을 추가 해 야 할 때 만 사용 할 수 있다.
5.응용 실례:장비 대군!어떠한 장비 도 없 을 때(핵심 기능)주먹 과 발 로 격투 할 수 있다.소총 을 장 착 하여 정상적으로 사격 할 수 있다.중기 총 을 장 착 하여 소사 할 수 있다.로켓 통 을 장 착 하여 방공 할 수 있다.
5.1 유형 도 디자인
//img.jbzj.com/file_images/article/201606/2016060111392632.png
5.2 코드 구현

 /// <summary>
 ///    ,   Component
 /// </summary>
 public abstract class Equipment
 {

  public abstract void Attack();
 }

 /// <summary>
 ///    ,   Equipment
 /// </summary>
 public class Soldier : Equipment
 {
  public Soldier()
  {
   //     
  }

  /// <summary>
  ///               
  /// </summary>
  public override void Attack()
  {
   Console.WriteLine("     !");
  }
 }

 public abstract class EquipDecorator : Equipment
 {
  protected Equipment equipment;

  /// <summary>
  ///     ,                
  /// </summary>
  /// <param name="equipment"></param>
  public void SetComponent(Equipment equipment)
  {
   this.equipment = equipment;
  }

  /// <summary>
  ///   
  /// </summary>
  public override void Attack()
  {
   //     ,        
   if (equipment != null)
   {
    equipment.Attack();
   }
  }
 }

 /// <summary>
 ///   
 /// </summary>
 public class RifleEquipment : EquipDecorator
 {
  public override void Attack()
  {
   base.Attack();

   Console.WriteLine("    , !");
  }
 }

 /// <summary>
 ///   
 /// </summary>
 public class MachineGunEquipment : EquipDecorator
 {
  public override void Attack()
  {
   base.Attack();

   Console.WriteLine("    ,   !");
  }
 }

 /// <summary>
 ///    
 /// </summary>
 public class RocketGunEquipment : EquipDecorator
 {
  public override void Attack()
  {
   base.Attack();

   Console.WriteLine("     , ......!");
  }
 }

5.3 클 라 이언 트 호출

 class Program
 {
  static void Main(string[] args)
  {
   //     
   Soldier soldier = new Soldier();

   //     
   RifleEquipment rifle = new RifleEquipment();
   MachineGunEquipment machineGun = new MachineGunEquipment();
   RocketGunEquipment rocketGun = new RocketGunEquipment();

   //            
   rifle.SetComponent(soldier);
   machineGun.SetComponent(rifle);
   rocketGun.SetComponent(machineGun);

   //   ,       ,         ,  ,   .      rocketGun.Attack().
   rocketGun.Attack();

   Console.Read();
  }
 }

5.4 실행 결과
주먹 과 발 로 공격!
소총 사격!탁!
기관총 소사,돌격!
로켓 사격!쏴!!
이상 이 바로 본문의 전체 내용 입 니 다.여러분 께 참고 가 될 수 있 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기