디자인 모델 시리즈 - 관찰자 모드

날씨 가 점점 따뜻 해 지기 시 작 했 습 니 다. 매일 사무실 에서 코드 를 쓰 면 몸 이 점점 나 빠 지 는 것 같 습 니 다. 이 활동 을 해 야 합 니 다. 즐 거 운 기술 살롱 과 헤 이 피 바 진 춘 림 과 교류 한 후에 날씨 가 따뜻 해 지기 로 결 정 했 습 니 다. 단체 에서 작은 야외 활동 을 발표 합 니 다. 모두 같이 등산 이나 운동 을 하 러 나 가서 자신의 몸 과 마음 을 풀 어 줍 니 다!하 이 피 바 QQ 군: 190784175!
          사례 장면
           맞 아, 관례 상 오늘 디자인 모델 의 장면 이 야. 그럼 다음 장면 을 분석 해 보 자. 우선, 우리 의 이번 야외 활동 의 주최자 가 해 피 기술 살롱 헤 이 피 죠?헤 이 피 바 는 모든 참여 멤버 를 보호 하고 멤버 활동 의 구체 적 인 시간 과 집합 장 소 를 알려 주 며 멤버 들 은 헤 이 피 바 의 통 지 를 관찰 하여 활동 소식 을 얻어 야 한다.그러면 우 리 는 코드 로 다음 과 같은 것 을 실현 합 니 다.
           1. 해 피 테 크 놀 로 지 살롱 해 피 바 의 실현:
              ① 먼저 한 구성원 의 집합 을 지 켜 야 한다. 이 집합 은 행사 에 참가 하 는 모든 구성원 을 저장 하고 구성원 을 추가 하 는 것 을 포함한다. 만약 에 구성원 이 임시로 일이 있 으 면 집합 에서 제거 해 야 하기 때문에 한 명의 구성원 을 제거 해 야 한다.
              ② 다음 에 모든 멤버 에 게 활동 정보 가 발표 되 었 음 을 알 리 는 방법 이 있 습 니 다.
              ③ 마지막 으로 활동 에 대한 상세 한 정보, 코드 는 다음 과 같다.
 
    
    
    
    
  1. ///   
  2.     ///     
  3.     ///   
  4.     public class HappyBar  
  5.     {  
  6.         // QQ  
  7.         List memberList = new List();  
  8.  
  9.         ///   
  10.         ///   
  11.         ///   
  12.         ///   
  13.         public void Attach(QQMember member)  
  14.         {  
  15.             memberList.Add(member);  
  16.         }  
  17.  
  18.         ///   
  19.         ///   
  20.         ///   
  21.         ///   
  22.         public void Detach(QQMember member)  
  23.         {  
  24.             memberList.Remove(member);  
  25.         }  
  26.  
  27.         ///   
  28.         ///   
  29.         ///   
  30.         public void Notify()  
  31.         {  
  32.             memberList.ForEach(p => p.GoDestination());  
  33.         }  
  34.  
  35.         ///   
  36.         ///   
  37.         ///   
  38.         public string PublishInfo  
  39.         {  
  40.             get;  
  41.             set;  
  42.         }  
  43.     }  

 
           2.  이벤트 참여 자 멤버 멤버 의 실현 
          ① 참여 자 는 자신의 기본 정보, 예 를 들 어 이름 등 이 있다.
          ② 참여 자 는 이벤트 알림 을 읽 고 제시간에 목적지 로 가 야 합 니 다. 코드 는 다음 과 같 습 니 다.
   
   
   
   
  1. ///   
  2.     ///  QQ  
  3.     ///   
  4.     public class QQMember  
  5.     {  
  6.         //  
  7.         public string Name { getset; }  
  8.         //  
  9.         public HappyBar happyBar { getset; }  
  10.  
  11.         ///   
  12.         ///  ,  
  13.         ///   
  14.         public void GoDestination()  
  15.         {  
  16.             Console.WriteLine("{0}   {1}..",Name,happyBar.PublishInfo);  
  17.         }  
  18.     }  

           3. 주 함수 호출 코드 는 다음 과 같다.
     
     
     
     
  1. static void Main(string[] args)  
  2.        {  
  3.            //  
  4.            HappyBar bar = new HappyBar();  
  5.  
  6.            QQMember memberZhang = new QQMember() { Name=" ", happyBar = bar };  
  7.            QQMember memberDing = new QQMember() { Name=" ", happyBar = bar };  
  8.            QQMember memberZheng = new QQMember() { Name = " ", happyBar = bar };  
  9.  
  10.            bar.Attach(memberZhang); //  
  11.            bar.Attach(memberDing);  //  
  12.            bar.Attach(memberZheng); //  
  13.  
  14.            bar.Detach(memberZhang); // ,  
  15.  
  16.            //  
  17.            bar.PublishInfo = "    :2012 4 XX ";  
  18.  
  19.            //  
  20.            bar.Notify();  
  21.  

                 실행 결 과 는 다음 과 같 습 니 다.
          2. 관찰자 모델
           위의 코드 는 분명히 결합 도가 너무 높 습 니 다. 만약 이때 제 절차 가 시 작 된 조직 이 헤 이 피 가 아니라면 요?시작 하 는 클래스 를 다시 추가 하고 구성원 이 알림 에 관심 을 가 지 는 속성 을 수정 해 야 합 니까?만약 에 발 표 된 활동 이 QQ 그룹 구성원 을 상대 하 는 것 이 아니 라 지역사회 구성원 을 상대 하 는 것 을 말한다 면?한 지역 사회 구성원 의 구성원 류 에 가입 해 야 하 는 지, 그러면 활동 발기 류 의 집합 은 재 구성 해 야 한다.관찰자 모델 은 확장 할 수 있 고 기 존의 수 요 를 만족 시 킬 수 있 는 좋 은 방안 을 제공 했다.
          1. 관찰자 모드 소개
           관찰자 모드 유형 도 는 다음 과 같다.
          
          ① Subject 인터페이스: 주제 유형 을 추상 화하 여 앞으로 어떤 주제 든 이 인 터 페 이 스 를 실현 하면 주제 활동 을 할 수 있다.
          ② Observer 인터페이스: 관찰자 류 를 추상 화하 여 어떤 유형의 관찰자 든 관찰자 인 터 페 이 스 를 실현 함으로써 주제 알림 을 관찰 하 는 기능 을 가진다.
          ③ Concrete Subject 류: 주제 추상 을 실현 하고 구체 적 인 기능 을 실현 한다.위 에 있 는 HappyBar 클래스 에 대응 하여 이벤트 알림 을 유지 하고 시작 합 니 다.
          ④ Conrete Observer 류: 관찰자 의 추상 을 실현 하고 구체 적 인 기능 을 실현 한다.위 에 있 는 QQQMember 클래스 에 대응 하여 테마 클래스 의 알림 을 관찰 하고 자신의 상 태 를 업데이트 합 니 다.
        2. 우리 코드 재 구성
         먼저 우 리 는 주제 류 의 규칙 과 관찰자 류 를 추상 화해 야 한다. 그러면 우 리 는 앞으로 어떤 주제 와 관찰자 든 각 사용자 정의 추상 을 실현 함으로써 프로그램 을 확장 하여 수정 절 차 를 피 할 수 있다.코드 는 다음 과 같 습 니 다:
   
   
   
   
  1. public interface ISubject  
  2.    {  
  3.        //  
  4.        void Attach(IObserver member);  
  5.        //  
  6.        void Detach(IObserver member);  
  7.        //  
  8.        void Notify();  
  9.        string PublishInfo { getset; }  
  10.    }  
  11.  
  12.    public interface IObserver  
  13.    {  
  14.        //  
  15.        void GoUpdate();  
  16.    }  

        그 다음 에 우 리 는 우리 의 이전 주제 류, 즉 활동 발기 류 HappyBar 를 수정 하여 자신 이 ISubject 인 터 페 이 스 를 실현 하도록 하고 구성원 집합 유형 을 추상 적 인 IObserver 인터페이스 유형 으로 수정 해 야 한다. 코드 는 다음 과 같다.
   
   
   
   
  1. ///   
  2.    ///     
  3.    ///   
  4.    public class HappyBar : ISubject  
  5.    {  
  6.        // QQ  
  7.        List memberList = new List();  
  8.  
  9.        ///   
  10.        ///   
  11.        ///   
  12.        ///   
  13.        public void Attach(IObserver member)  
  14.        {  
  15.            memberList.Add(member);  
  16.        }  
  17.  
  18.        ///   
  19.        ///   
  20.        ///   
  21.        ///   
  22.        public void Detach(IObserver member)  
  23.        {  
  24.            memberList.Remove(member);  
  25.        }  
  26.  
  27.        ///   
  28.        ///   
  29.        ///   
  30.        public void Notify()  
  31.        {  
  32.            memberList.ForEach(p => p.GoUpdate());  
  33.        }  
  34.  
  35.        ///   
  36.        ///   
  37.        ///   
  38.        public string PublishInfo  
  39.        {  
  40.            get;  
  41.            set;  
  42.        }  
  43.    }  

        구성원 류 의 실현 을 계속 재 구성 하고 구성원 류 의 인 터 페 이 스 를 실현 하면 된다.코드 는 다음 과 같 습 니 다:
   
   
   
   
  1. ///   
  2.     ///  QQ  
  3.     ///   
  4.     public class QQMember : IObserver  
  5.     {  
  6.         //  
  7.         public string Name { getset; }  
  8.         //  
  9.         public HappyBar happyBar { getset; }  
  10.  
  11.         ///   
  12.         ///  ,  
  13.         ///   
  14.         public void GoUpdate()  
  15.         {  
  16.             Console.WriteLine("{0}   {1}..",Name,happyBar.PublishInfo);  
  17.         }  
  18.     }  

         주 함수 호출 은 다음 과 같 습 니 다:
           
3. 프로그램의 확장
    
    
    
    
  1. //  
  2.             HappyBar bar = new HappyBar();  
  3.  
  4.             IObserver memberZhang = new QQMember() { Name=" ", happyBar = bar };  
  5.             IObserver memberDing = new QQMember() { Name = " ", happyBar = bar };  
  6.             IObserver memberZheng = new QQMember() { Name = " ", happyBar = bar };  
  7.  
  8.             bar.Attach(memberZhang); //  
  9.             bar.Attach(memberDing);  //  
  10.             bar.Attach(memberZheng); //  
  11.  
  12.             bar.Detach(memberZhang); // ,  
  13.  
  14.             //  
  15.             bar.PublishInfo = "    :2012 4 XX ";  
  16.  
  17.             //  
  18.             bar.Notify();  

          이때 우리 가 만약 에 테 마 를 추가 하려 면 헤 이 피 가 아니 라 윈도 폰 7 과 윈도 8 개발 자 훈련소 에 참가 하 는 테 마 를 추가 하려 면 시작 자 는 마이크로소프트 입 니 다.우리 가 확장 한 코드 는 다음 과 같다.
   
   
   
   
  1. public class MicrosoftCenter : ISubject  
  2.     {  
  3.         List memberList = new List();  
  4.  
  5.         ///   
  6.         ///   
  7.         ///   
  8.         ///   
  9.         public void Attach(IObserver member)  
  10.         {  
  11.             memberList.Add(member);  
  12.         }  
  13.  
  14.         ///   
  15.         ///   
  16.         ///   
  17.         ///   
  18.         public void Detach(IObserver member)  
  19.         {  
  20.             memberList.Remove(member);  
  21.         }  
  22.  
  23.         ///   
  24.         ///   
  25.         ///   
  26.         public void Notify()  
  27.         {  
  28.             memberList.ForEach(p => p.GoUpdate());  
  29.         }  
  30.  
  31.         ///   
  32.         ///   
  33.         ///   
  34.         public string PublishInfo  
  35.         {  
  36.             get;  
  37.             set;  
  38.         }  
  39.     }  

         물론 참여 할 수 있 는 구성원 은 개발 자, 학생, 사장 등 유형의 관찰자 가 있 습 니 다. 우 리 는 서로 다른 유형의 관찰자 유형 을 대응 하 는 관찰자 추상 을 실현 하면 됩 니 다. 코드 는 다음 과 같 습 니 다.
    
    
    
    
  1. ///   
  2.     ///   
  3.     ///   
  4.     public class Developer : IObserver  
  5.     {     
  6.         //  
  7.         public string Name { getset; }  
  8.         //  
  9.         public ISubject subject { getset; }  
  10.  
  11.         ///   
  12.         ///  ,  
  13.         ///   
  14.         public void GoUpdate()  
  15.         {  
  16.             Console.WriteLine("{0}   {1}..", Name, subject.PublishInfo);  
  17.         }  
  18.     }  
  19.  
  20.     ///   
  21.     ///   
  22.     ///   
  23.     public class Student : IObserver  
  24.     {  
  25.         //  
  26.         public string Name { getset; }  
  27.         //  
  28.         public ISubject subject { getset; }  
  29.  
  30.         ///   
  31.         ///  ,  
  32.         ///   
  33.         public void GoUpdate()  
  34.         {  
  35.             Console.WriteLine("{0}   {1}..", Name, subject.PublishInfo);  
  36.         }  
  37.     }  

    
       주 함수 호출 은 다음 과 같 습 니 다:
   
   
   
   
  1.  static void Main(string[] args)  
  2.         {  
  3.             //  
  4.             MicrosoftCenter mc = new MicrosoftCenter();  
  5.  
  6.             IObserver member1 = new Developer() { Name = " ", happyBar = mc };  
  7.             IObserver member2 = new Developer() { Name = " ", happyBar = mc };  
  8.  
  9.             mc.Attach(member1);  
  10.             mc.Attach(member2);  
  11.             mc.PublishInfo = " ";  
  12.             mc.Notify();  
  13. }  

         실행 결 과 는 다음 과 같 습 니 다.
    
          3. C \ # 버 전 관찰자 모드
           관찰자 모델 이라는 통지 체 제 를 이해 한 후에 우 리 는 통 지 를 할 때 모든 구성원 에 게 알 리 는 것 을 느 낄 수 있다.이것 은 C \ # 의 의뢰 와 유사 합 니 다. 만약 에 이 장면 이 C \ # 에서 응용 되면 의뢰 를 사용 하 는 것 이 더욱 유연 하고 편리 할 수 있 습 니 다. 코드 는 반드시 모델 이 아니 라 간단 하면 아름 답 습 니 다!위탁 재 구성 방법 을 사용 하면 다음 과 같다.
           1. 업데이트 알림 의뢰 설명:
   
   
   
   
  1. //  
  2.     delegate void EventHandler();  

           2. 봄 나들이 이벤트 테마 정의:
     
     
     
     
  1. ///   
  2.     ///     
  3.     ///   
  4.     public class HappyBar   
  5.     {  
  6.         // ,  
  7.         public event EventHandler GoUpdate;  
  8.  
  9.         ///   
  10.         ///   
  11.         ///   
  12.         public void Notify()  
  13.         {  
  14.             GoUpdate();  
  15.         }  
  16.  
  17.         ///   
  18.         ///   
  19.         ///   
  20.         public string PublishInfo  
  21.         {  
  22.             get;  
  23.             set;  
  24.         }  
  25.     }  

          3. 참여 자 (관찰자) 구성원 정의
     
     
     
     
  1. ///   
  2.     ///  QQ  
  3.     ///   
  4.     public class QQMember   
  5.     {  
  6.         //  
  7.         public string Name { getset; }  
  8.         //  
  9.         public HappyBar happyBar { getset; }  
  10.  
  11.         ///   
  12.         ///  ,  
  13.         ///   
  14.         public void GoUpdate()  
  15.         {  
  16.             Console.WriteLine("{0}   {1}..", Name, happyBar.PublishInfo);  
  17.         }  
  18.     }  

            4. 주 함수 호출 은 다음 과 같다.
    
    
    
    
  1. static void Main(string[] args)  
  2.        {  
  3.            HappyBar hb = new HappyBar();  
  4.  
  5.            QQMember member1 = new QQMember() { Name = " ", happyBar = hb };  
  6.            QQMember member2 = new QQMember() { Name = " ", happyBar = hb };  
  7.  
  8.            hb.PublishInfo = "    :2012 4 XX ";  
  9.            hb.GoUpdate += new  1.EventHandler(member1.GoToUpdate);  
  10.            hb.GoUpdate += new  1.EventHandler(member2.GoToUpdate);  
  11.  
  12.            hb.Notify();  
  13.  

            5. 실행 결 과 는 다음 과 같다.
          관찰자 모드 가 끝 났 습 니 다. 야외 활동 의 구체 적 인 시간 은 아직 확정 되 지 않 았 습 니 다. 의뢰 사건 의 코드 를 사용 하 는 것 은 아직 높 은 결합 상태 입 니 다. 결합 을 어떻게 푸 는 지 는 여러분 에 게 달 려 있 습 니 다. 코드 를 댓 글로 공유 할 수 있 습 니 다!허허, 추천 도 해 줘!힘 들 게 썼 네!

좋은 웹페이지 즐겨찾기