디자인 모드 시리즈 - 장식 모드

퇴근 하고 집에 가 는 것 이 지루 한 데다 가 이번 해 가 순 조 롭 지 못 해서 남자 가 퇴근 하 는 무료 한 시간 을 보 내 는 것 을 보고 18 회 를 클릭 하여 오 프 닝 멘 트 를 하기 로 했다.
        우 리 는 이 1 초 동안 변화 하 는 세상 에 살 고 있 습 니 다. 때로는 우정 이 사랑 보다 더 믿 을 수 있 습 니 다. 친 구 는 당신 이 가장 힘 들 때 묵묵히 당신 의 모든 평안 을 지 킬 수 있 습 니 다.정 은 빠르게 두 진영 으로 변 한다!        우 리 는 모두 사랑 이 필요 하 다. 우리 모두 우정 이 필요 한 것 처럼 우 리 는 이 세상 에서 끊임없이 찾 고 있다. 왜냐하면 우 리 는 하나 가 없어 서 는 안 되 기 때문이다.
       1. 장면 시 뮬 레이 션
        이렇게 해서 이 씨 를 떠 올 리 게 한다. 나 와 이 씨 는 아주 친 한 친구 이다. 물론 그 는 나 답지 않 고 홀아비 이기 때문에 그 는 우정 과 사랑 만 있 는 것 이 아니다. 그러나 최근 며칠 동안 그들 이 싸 웠 다. 무슨 원인 이 있 니?더 이상 말 하지 않 겠 습 니 다. 어쨌든 남자 인 이 씨 는 스스로 잘못 을 인정 하고 여 자 를 만회 하기 로 결 정 했 습 니 다. 하지만 여자 가 데이트 처럼 아름 답 지 않 은 것 을 만회 하 는 것 은 한편 입 니 다. 중요 한 것 은 사과 의 성의 입 니 다. 예 를 들 어 사과 편지 한 통, 장미꽃 한 다발, 첫 번 째 여자 가 보 낸 스카프 를 가지 고 성 의 를 표시 하 는 것 등 입 니 다.나 는 이런 차 림 에 성실한 태 도 를 더 하면 반드시 성공 적 으로 돌아 올 것 이 라 고 생각한다.       
        그러면 우 리 는 코드 로 실현 합 시다. 
   
   
   
   
  1. public class MrLi  
  2.    {  
  3.        private const string name = "limou";  
  4.  
  5.        ///   
  6.        ///   
  7.        ///   
  8.        public void Letters()  
  9.        {  
  10.            Console.Write("  ");  
  11.        }  
  12.  
  13.        ///   
  14.        ///   
  15.        ///   
  16.        public void Rose()  
  17.        {  
  18.            Console.Write("  ");  
  19.        }  
  20.  
  21.        ///   
  22.        ///   
  23.        ///   
  24.        public void Scarf()  
  25.        {  
  26.            Console.Write("  ");  
  27.        }  
  28.  
  29.        ///   
  30.        ///   
  31.        ///   
  32.        public void Operation()  
  33.        {  
  34.            Console.WriteLine(" :");  
  35.            this.Letters();  
  36.            this.Rose();  
  37.            this.Scarf();  
  38.        }  
  39.    }  
  40.  static void Main(string[] args)  
  41.  {  
  42.        MrLi li = new MrLi();  
  43.        //  
  44.        li.Operation();  
  45.        Console.WriteLine();  
  46.  }  

         실행 결 과 는 다음 과 같 습 니 다.       
        이상 의 코드 를 완성 하 자마자 이 씨 의 전 화 를 받 고 성공 했다 고 말 했다. 이 방법 으로 정말 효과 가 있 구나. 그럼 우리 내일 저녁 에 밥 을 먹고 축하 하 자.이 씨 가 말 했다. "안 돼. 우 리 는 방금 화 해 했 어. 내일 저녁 에 나 는 내 여자 친구 밖 에 없어. 나 는 그녀 와 함께 밥 을 먹 을 거 야!" 나 는 어 지 러 워, 무 거 운 색 의 가 벼 운 친구 야!
        그럼 그 는 내일 여자친 구 와 데 이 트 를 할 때 다 시 는 이런 식 으로 하지 않 을 것 이다. 틀림없이 쓸모 가 없 을 것 이다. 만약 그 가 내일 계속 장미꽃 을 가지 고 선글라스 와 목도 리 를 가지 고 간다 면?이 럴 때 우리 가 방금 실현 한 클래스 는 만족 할 수 없 을 것 같은 데 어 떡 하지?최 악의 방법 은 MrLi 류 에 선 글 라 스 를 끼 우 는 방법 을 넣 는 것 이다. 왜 최 악의 방법 일 까?대상 지향 원칙 중의 개방 - 폐쇄 원칙 을 어 겼 기 때문이다.그렇다면 개방 폐쇄 원칙 은 무엇 일 까?
        개방 폐쇄 원칙: 클래스 는 확장 할 수 있 지만 수정 할 수 없습니다.
        그렇다면 MrLi 의 분장 을 어떻게 지원 할 수 있 을 까?서 두 르 지 말고 먼저 장식 모드 를 보 세 요!
        2. 장식 모드
         장식 모델: 장식 모델 은 동태 적 으로 대상 에 게 책임 을 증가 하 는 것 이다. 확장 기능 에 있어 장식 모델 은 계승 보다 더욱 유연 한 방안 을 제공 했다.
         장식 모드 유형 도 는 다음 과 같다.
        Component 류: 추상 적 인 장식 대상 과 피 장식 대상 의 공 통 된 장식 행위.
        Concrete Component 클래스: 장 식 된 주 대상 입 니 다.
        Decorator 클래스: 장식 용 추상 클래스 로 Component 클래스 의 인 스 턴 스 와 장식 대상 과 의 공동 행 위 를 포함 하고 Component 클래스 의 인 스 턴 스 를 포함 하여 미래의 구체 적 인 장식 유형 이 모두 명확 한 장식 대상 이 있다 는 것 을 나타 낸다.
        ConcreteDecrator A 와 ConcreteDecrator B 클래스: 구체 적 인 장식 클래스 의 실례 입 니 다. 이 대상 은 추상 적 인 Decorator 클래스 를 실 현 했 고 장식 대상 을 포함 하여 이 대상 을 장식 합 니 다.
        장식 모드 코드 는 다음 과 같 습 니 다.
   
   
   
   
  1. ///   
  2.    ///   
  3.    ///   
  4.    public abstract class Component  
  5.    {  
  6.        //  
  7.        public abstract void Operation();  
  8.    }  
  9.  
  10.    ///   
  11.    ///   
  12.    ///   
  13.    public class ConcreteComponent : Component  
  14.    {  
  15.        public override void Operation()  
  16.        {  
  17.            Console.WriteLine(" ");  
  18.        }  
  19.    }  
  20.  
  21.    ///   
  22.    ///   
  23.    ///   
  24.    public abstract class Decorator : Component  
  25.    {  
  26.        protected Component component;  
  27.  
  28.        public void SetComponent(Component component)  
  29.        {  
  30.            this.component = component;  
  31.        }  
  32.  
  33.        public override void Operation()  
  34.        {  
  35.            if (component != null)  
  36.            {  
  37.                component.Operation();  
  38.            }  
  39.        }  
  40.    }  
  41.  
  42.    ///   
  43.    ///   
  44.    ///   
  45.    public class ConcreteDecoratorA : Decorator  
  46.    {  
  47.        private void AddedBehaviorA()  
  48.        {  
  49.            Console.WriteLine(" A");  
  50.        }  
  51.  
  52.        public override void Operation()  
  53.        {  
  54.            base.Operation();  
  55.            AddedBehaviorA();  
  56.        }  
  57.    }  
  58.  
  59.    public class ConcreteDecoratorB : Decorator  
  60.    {  
  61.        private void AddedBehaviorB()  
  62.        {  
  63.            Console.WriteLine(" B");  
  64.        }  
  65.  
  66.        public override void Operation()  
  67.        {  
  68.            base.Operation();  
  69.            AddedBehaviorB();  
  70.        }  
  71.    }  

         주 함수 호출 은 다음 과 같 습 니 다:
    
    
    
    
  1. static void Main(string[] args)  
  2.       {  
  3.           //    
  4.           ConcreteComponent cc = new ConcreteComponent();  
  5.           // A   
  6.           ConcreteDecoratorA cda = new ConcreteDecoratorA();  
  7.           // A   
  8.           ConcreteDecoratorB cdb = new ConcreteDecoratorB();  
  9.  
  10.           // A  cc  
  11.           cda.SetComponent(cc);  
  12.           // B  A  
  13.           cdb.SetComponent(cda);  
  14.           //  
  15.           cdb.Operation();  
  16.  
  17.           //  
  18.           // B  cc  
  19.           cdb.SetComponent(cc);  
  20.           // A  B  
  21.           cda.SetComponent(cdb);  
  22.           //  
  23.           cda.Operation();  
  24.     }  

              이 를 통 해 알 수 있 듯 이 장식 모델 이 있 으 면 우 리 는 장식 대상 을 쉽게 늘 리 고 유연 하 게 조직 장식 대상 의 분장 순 서 를 정할 수 있다. 만약 에 우리 가 장식 모델 로 우리 의 첫 번 째 부분 장면 을 실현 한다 면 어떻게 해 야 할 까?
        3. 장식 모델 의 유연 한 활용
         그러면 우리 가 디자인 한 유 도 는 다음 과 같다.
         코드 구현 은 다음 과 같 습 니 다.
   
   
   
   
  1. ///   
  2.   ///   
  3.   ///   
  4.   public abstract class DressUp  
  5.   {  
  6.       //  
  7.       public abstract void ToDressUp();  
  8.   }  
  9.  
  10.   ///   
  11.   ///  , ,  
  12.   ///   
  13.   public class MrLi : DressUp  
  14.   {  
  15.       private const string name = "limou";  
  16.  
  17.       ///   
  18.       ///   
  19.       ///   
  20.       public override void ToDressUp()  
  21.       {  
  22.           Console.WriteLine("{0} :",name);  
  23.       }  
  24.   }  
  25.  
  26.   ///   
  27.   ///   
  28.   ///   
  29.   public abstract class Decorator:DressUp  
  30.   {  
  31.       //  
  32.       protected DressUp component = null;  
  33.  
  34.       ///   
  35.       ///   
  36.       ///   
  37.       ///   
  38.       public void SetDressUp(DressUp com)  
  39.       {  
  40.           this.component = com;  
  41.       }  
  42.  
  43.       ///   
  44.       ///   
  45.       ///   
  46.       public override void ToDressUp()  
  47.       {  
  48.           if (component != null)  
  49.           {  
  50.               component.ToDressUp();  
  51.           }  
  52.       }  
  53.   }  
  54.  
  55.   ///   
  56.   ///   
  57.   ///   
  58.   public class Letters : Decorator  
  59.   {  
  60.       ///   
  61.       ///   
  62.       ///   
  63.       public override void ToDressUp()  
  64.       {  
  65.           base.ToDressUp();  
  66.           Console.Write("  ");  
  67.       }  
  68.   }  
  69.  
  70.   ///   
  71.   ///   
  72.   ///   
  73.   public class Rose : Decorator  
  74.   {  
  75.       ///   
  76.       ///   
  77.       ///   
  78.       public override void ToDressUp()  
  79.       {  
  80.           base.ToDressUp();  
  81.           Console.Write("  ");  
  82.       }  
  83.   }  
  84.  
  85.   ///   
  86.   ///   
  87.   ///   
  88.   public class Scarf : Decorator  
  89.   {  
  90.       ///   
  91.       ///   
  92.       ///   
  93.       public override void ToDressUp()  
  94.       {  
  95.           base.ToDressUp();  
  96.           Console.Write("  ");  
  97.       }  
  98.   }  
  99.  
  100.   ///   
  101.   ///  ,  
  102.   ///   
  103.   public class Sunglasses :Decorator  
  104.   {  
  105.       ///   
  106.       ///   
  107.       ///   
  108.       public override void ToDressUp()  
  109.       {  
  110.           base.ToDressUp();  
  111.           Console.Write("  ");  
  112.       }  
  113.   }  

     주 함수 호출 은 다음 과 같 습 니 다:
    
    
    
    
  1. static void Main(string[] args)  
  2.        {  
  3.            MrLi li = new MrLi();  
  4.  
  5.            //  
  6.            Console.WriteLine(" :");  
  7.            //  
  8.            Letters letters = new Letters();  
  9.            //  
  10.            Rose rose = new Rose();  
  11.            //  
  12.            Scarf scarf = new Scarf();  
  13.  
  14.            //  
  15.            letters.SetDressUp(li);  
  16.            //  
  17.            rose.SetDressUp(letters);  
  18.            //  
  19.            scarf.SetDressUp(rose);  
  20.            //  
  21.            scarf.ToDressUp();  
  22.            Console.WriteLine();  
  23.            Console.WriteLine("--------------------------------------");  
  24.            //  
  25.            Console.WriteLine(" ");  
  26.            //  
  27.            Letters let = new Letters();  
  28.            //  
  29.            Sunglasses sunglasses = new Sunglasses();  
  30.            //  
  31.            Scarf sca = new Scarf();  
  32.  
  33.            //  
  34.            let.SetDressUp(li);  
  35.            //  
  36.            sunglasses.SetDressUp(let);  
  37.            //  
  38.            sca.SetDressUp(sunglasses);  
  39.            //  
  40.            sca.ToDressUp();  
  41.            Console.WriteLine();  
  42.      }  

            실행 결 과 는 다음 과 같 습 니 다.   
    이렇게 장식 모델 을 이용 하면 앞으로 새로운 장식품 에 대한 확장 을 효과적으로 해결 할 수 있 고 원래 의 종 류 를 수정 하지 않 아 도 개방 폐쇄 원칙 을 완전히 만족 시 킬 수 있다.

좋은 웹페이지 즐겨찾기