디자인 모델 시리즈 - 관찰자 모드
사례 장면
맞 아, 관례 상 오늘 디자인 모델 의 장면 이 야. 그럼 다음 장면 을 분석 해 보 자. 우선, 우리 의 이번 야외 활동 의 주최자 가 해 피 기술 살롱 헤 이 피 죠?헤 이 피 바 는 모든 참여 멤버 를 보호 하고 멤버 활동 의 구체 적 인 시간 과 집합 장 소 를 알려 주 며 멤버 들 은 헤 이 피 바 의 통 지 를 관찰 하여 활동 소식 을 얻어 야 한다.그러면 우 리 는 코드 로 다음 과 같은 것 을 실현 합 니 다.
1. 해 피 테 크 놀 로 지 살롱 해 피 바 의 실현:
① 먼저 한 구성원 의 집합 을 지 켜 야 한다. 이 집합 은 행사 에 참가 하 는 모든 구성원 을 저장 하고 구성원 을 추가 하 는 것 을 포함한다. 만약 에 구성원 이 임시로 일이 있 으 면 집합 에서 제거 해 야 하기 때문에 한 명의 구성원 을 제거 해 야 한다.
② 다음 에 모든 멤버 에 게 활동 정보 가 발표 되 었 음 을 알 리 는 방법 이 있 습 니 다.
③ 마지막 으로 활동 에 대한 상세 한 정보, 코드 는 다음 과 같다.
- ///
- ///
- ///
- public class HappyBar
- {
- // QQ
- List
memberList = new List();
-
- ///
- ///
- ///
- ///
- public void Attach(QQMember member)
- {
- memberList.Add(member);
- }
-
- ///
- ///
- ///
- ///
- public void Detach(QQMember member)
- {
- memberList.Remove(member);
- }
-
- ///
- ///
- ///
- public void Notify()
- {
- memberList.ForEach(p => p.GoDestination());
- }
-
- ///
- ///
- ///
- public string PublishInfo
- {
- get;
- set;
- }
- }
2. 이벤트 참여 자 멤버 멤버 의 실현
① 참여 자 는 자신의 기본 정보, 예 를 들 어 이름 등 이 있다.
② 참여 자 는 이벤트 알림 을 읽 고 제시간에 목적지 로 가 야 합 니 다. 코드 는 다음 과 같 습 니 다.
- ///
- /// QQ
- ///
- public class QQMember
- {
- //
- public string Name { get; set; }
- //
- public HappyBar happyBar { get; set; }
-
- ///
- /// ,
- ///
- public void GoDestination()
- {
- Console.WriteLine("{0} {1}..",Name,happyBar.PublishInfo);
- }
- }
3. 주 함수 호출 코드 는 다음 과 같다.
- static void Main(string[] args)
- {
- //
- HappyBar bar = new HappyBar();
-
- QQMember memberZhang = new QQMember() { Name=" ", happyBar = bar };
- QQMember memberDing = new QQMember() { Name=" ", happyBar = bar };
- QQMember memberZheng = new QQMember() { Name = " ", happyBar = bar };
-
- bar.Attach(memberZhang); //
- bar.Attach(memberDing); //
- bar.Attach(memberZheng); //
-
- bar.Detach(memberZhang); // ,
-
- //
- bar.PublishInfo = " :2012 4 XX ";
-
- //
- bar.Notify();
-
실행 결 과 는 다음 과 같 습 니 다.
2. 관찰자 모델
위의 코드 는 분명히 결합 도가 너무 높 습 니 다. 만약 이때 제 절차 가 시 작 된 조직 이 헤 이 피 가 아니라면 요?시작 하 는 클래스 를 다시 추가 하고 구성원 이 알림 에 관심 을 가 지 는 속성 을 수정 해 야 합 니까?만약 에 발 표 된 활동 이 QQ 그룹 구성원 을 상대 하 는 것 이 아니 라 지역사회 구성원 을 상대 하 는 것 을 말한다 면?한 지역 사회 구성원 의 구성원 류 에 가입 해 야 하 는 지, 그러면 활동 발기 류 의 집합 은 재 구성 해 야 한다.관찰자 모델 은 확장 할 수 있 고 기 존의 수 요 를 만족 시 킬 수 있 는 좋 은 방안 을 제공 했다.
1. 관찰자 모드 소개
관찰자 모드 유형 도 는 다음 과 같다.
① Subject 인터페이스: 주제 유형 을 추상 화하 여 앞으로 어떤 주제 든 이 인 터 페 이 스 를 실현 하면 주제 활동 을 할 수 있다.
② Observer 인터페이스: 관찰자 류 를 추상 화하 여 어떤 유형의 관찰자 든 관찰자 인 터 페 이 스 를 실현 함으로써 주제 알림 을 관찰 하 는 기능 을 가진다.
③ Concrete Subject 류: 주제 추상 을 실현 하고 구체 적 인 기능 을 실현 한다.위 에 있 는 HappyBar 클래스 에 대응 하여 이벤트 알림 을 유지 하고 시작 합 니 다.
④ Conrete Observer 류: 관찰자 의 추상 을 실현 하고 구체 적 인 기능 을 실현 한다.위 에 있 는 QQQMember 클래스 에 대응 하여 테마 클래스 의 알림 을 관찰 하고 자신의 상 태 를 업데이트 합 니 다.
2. 우리 코드 재 구성
먼저 우 리 는 주제 류 의 규칙 과 관찰자 류 를 추상 화해 야 한다. 그러면 우 리 는 앞으로 어떤 주제 와 관찰자 든 각 사용자 정의 추상 을 실현 함으로써 프로그램 을 확장 하여 수정 절 차 를 피 할 수 있다.코드 는 다음 과 같 습 니 다:
- public interface ISubject
- {
- //
- void Attach(IObserver member);
- //
- void Detach(IObserver member);
- //
- void Notify();
- string PublishInfo { get; set; }
- }
-
- public interface IObserver
- {
- //
- void GoUpdate();
- }
그 다음 에 우 리 는 우리 의 이전 주제 류, 즉 활동 발기 류 HappyBar 를 수정 하여 자신 이 ISubject 인 터 페 이 스 를 실현 하도록 하고 구성원 집합 유형 을 추상 적 인 IObserver 인터페이스 유형 으로 수정 해 야 한다. 코드 는 다음 과 같다.
- ///
- ///
- ///
- public class HappyBar : ISubject
- {
- // QQ
- List
memberList = new List();
-
- ///
- ///
- ///
- ///
- public void Attach(IObserver member)
- {
- memberList.Add(member);
- }
-
- ///
- ///
- ///
- ///
- public void Detach(IObserver member)
- {
- memberList.Remove(member);
- }
-
- ///
- ///
- ///
- public void Notify()
- {
- memberList.ForEach(p => p.GoUpdate());
- }
-
- ///
- ///
- ///
- public string PublishInfo
- {
- get;
- set;
- }
- }
구성원 류 의 실현 을 계속 재 구성 하고 구성원 류 의 인 터 페 이 스 를 실현 하면 된다.코드 는 다음 과 같 습 니 다:
- ///
- /// QQ
- ///
- public class QQMember : IObserver
- {
- //
- public string Name { get; set; }
- //
- public HappyBar happyBar { get; set; }
-
- ///
- /// ,
- ///
- public void GoUpdate()
- {
- Console.WriteLine("{0} {1}..",Name,happyBar.PublishInfo);
- }
- }
주 함수 호출 은 다음 과 같 습 니 다:
3. 프로그램의 확장
- //
- HappyBar bar = new HappyBar();
-
- IObserver memberZhang = new QQMember() { Name=" ", happyBar = bar };
- IObserver memberDing = new QQMember() { Name = " ", happyBar = bar };
- IObserver memberZheng = new QQMember() { Name = " ", happyBar = bar };
-
- bar.Attach(memberZhang); //
- bar.Attach(memberDing); //
- bar.Attach(memberZheng); //
-
- bar.Detach(memberZhang); // ,
-
- //
- bar.PublishInfo = " :2012 4 XX ";
-
- //
- bar.Notify();
이때 우리 가 만약 에 테 마 를 추가 하려 면 헤 이 피 가 아니 라 윈도 폰 7 과 윈도 8 개발 자 훈련소 에 참가 하 는 테 마 를 추가 하려 면 시작 자 는 마이크로소프트 입 니 다.우리 가 확장 한 코드 는 다음 과 같다.
- public class MicrosoftCenter : ISubject
- {
- List
memberList = new List();
-
- ///
- ///
- ///
- ///
- public void Attach(IObserver member)
- {
- memberList.Add(member);
- }
-
- ///
- ///
- ///
- ///
- public void Detach(IObserver member)
- {
- memberList.Remove(member);
- }
-
- ///
- ///
- ///
- public void Notify()
- {
- memberList.ForEach(p => p.GoUpdate());
- }
-
- ///
- ///
- ///
- public string PublishInfo
- {
- get;
- set;
- }
- }
물론 참여 할 수 있 는 구성원 은 개발 자, 학생, 사장 등 유형의 관찰자 가 있 습 니 다. 우 리 는 서로 다른 유형의 관찰자 유형 을 대응 하 는 관찰자 추상 을 실현 하면 됩 니 다. 코드 는 다음 과 같 습 니 다.
- ///
- ///
- ///
- public class Developer : IObserver
- {
- //
- public string Name { get; set; }
- //
- public ISubject subject { get; set; }
-
- ///
- /// ,
- ///
- public void GoUpdate()
- {
- Console.WriteLine("{0} {1}..", Name, subject.PublishInfo);
- }
- }
-
- ///
- ///
- ///
- public class Student : IObserver
- {
- //
- public string Name { get; set; }
- //
- public ISubject subject { get; set; }
-
- ///
- /// ,
- ///
- public void GoUpdate()
- {
- Console.WriteLine("{0} {1}..", Name, subject.PublishInfo);
- }
- }
주 함수 호출 은 다음 과 같 습 니 다:
- static void Main(string[] args)
- {
- //
- MicrosoftCenter mc = new MicrosoftCenter();
-
- IObserver member1 = new Developer() { Name = " ", happyBar = mc };
- IObserver member2 = new Developer() { Name = " ", happyBar = mc };
-
- mc.Attach(member1);
- mc.Attach(member2);
- mc.PublishInfo = " ";
- mc.Notify();
- }
실행 결 과 는 다음 과 같 습 니 다.
3. C \ # 버 전 관찰자 모드
관찰자 모델 이라는 통지 체 제 를 이해 한 후에 우 리 는 통 지 를 할 때 모든 구성원 에 게 알 리 는 것 을 느 낄 수 있다.이것 은 C \ # 의 의뢰 와 유사 합 니 다. 만약 에 이 장면 이 C \ # 에서 응용 되면 의뢰 를 사용 하 는 것 이 더욱 유연 하고 편리 할 수 있 습 니 다. 코드 는 반드시 모델 이 아니 라 간단 하면 아름 답 습 니 다!위탁 재 구성 방법 을 사용 하면 다음 과 같다.
1. 업데이트 알림 의뢰 설명:
- //
- delegate void EventHandler();
2. 봄 나들이 이벤트 테마 정의:
- ///
- ///
- ///
- public class HappyBar
- {
- // ,
- public event EventHandler GoUpdate;
-
- ///
- ///
- ///
- public void Notify()
- {
- GoUpdate();
- }
-
- ///
- ///
- ///
- public string PublishInfo
- {
- get;
- set;
- }
- }
3. 참여 자 (관찰자) 구성원 정의
- ///
- /// QQ
- ///
- public class QQMember
- {
- //
- public string Name { get; set; }
- //
- public HappyBar happyBar { get; set; }
-
- ///
- /// ,
- ///
- public void GoUpdate()
- {
- Console.WriteLine("{0} {1}..", Name, happyBar.PublishInfo);
- }
- }
4. 주 함수 호출 은 다음 과 같다.
- static void Main(string[] args)
- {
- HappyBar hb = new HappyBar();
-
- QQMember member1 = new QQMember() { Name = " ", happyBar = hb };
- QQMember member2 = new QQMember() { Name = " ", happyBar = hb };
-
- hb.PublishInfo = " :2012 4 XX ";
- hb.GoUpdate += new 1.EventHandler(member1.GoToUpdate);
- hb.GoUpdate += new 1.EventHandler(member2.GoToUpdate);
-
- hb.Notify();
-
5. 실행 결 과 는 다음 과 같다.
관찰자 모드 가 끝 났 습 니 다. 야외 활동 의 구체 적 인 시간 은 아직 확정 되 지 않 았 습 니 다. 의뢰 사건 의 코드 를 사용 하 는 것 은 아직 높 은 결합 상태 입 니 다. 결합 을 어떻게 푸 는 지 는 여러분 에 게 달 려 있 습 니 다. 코드 를 댓 글로 공유 할 수 있 습 니 다!허허, 추천 도 해 줘!힘 들 게 썼 네!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
디자인 모델 의 공장 모델, 단일 모델자바 는 23 가지 디자인 모델 (프로 그래 밍 사상/프로 그래 밍 방식) 이 있 습 니 다. 공장 모드 하나의 공장 류 를 만들어 같은 인 터 페 이 스 를 실현 한 일부 종 류 를 인 스 턴 스 로 만 드 는 것...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.