>  기사  >  백엔드 개발  >  C# 디자인 패턴 - 관찰자 패턴의 대체 샘플 코드 요약

C# 디자인 패턴 - 관찰자 패턴의 대체 샘플 코드 요약

黄舟
黄舟원래의
2017-03-18 13:28:401368검색

구독-분배 모델, 관찰자 모델이라고도 하는데, 이 모델의 구현 메커니즘은 무엇인가요? 제품 개발에 실제로 어떻게 활용될 수 있나요? 패턴을 학습할 때, 엄격하게 학습하지 않는 것이 가장 좋으며, 대신 비즈니스 요구에 따라 의사 코드를 실제 코드로 점진적으로 변환할 수 있습니다. 그림을 그리고 코드를 작성하고 이 메커니즘을 직접 경험해 본 후에야 향후 제품 개발에 실제로 사용할 수 있습니다.

작성 후 수업 다이어그램 그리기:


C# 디자인 패턴 - 관찰자 패턴의 대체 샘플 코드 요약


우선 이름에서 알 수 있듯이 구독을 먼저 해야 하고, 보낸 사람이나 주최자가 스포츠 뉴스, 최신 핫플레이스 등을 작성한 후 보내기를 클릭하면 됩니다. 프로그램을 구독하시는 모든 분들께 발송됩니다.

그러므로 이 관계는 전형적인 일대다 관계임을 알 수 있습니다. 예를 들어 one은 주최자를 나타내고, Many는 이 신문을 구독하는 개인을 나타냅니다. , 이는 101보다 클 수도 있고 수천 또는 수백이 될 수도 있습니다. 이들 구독자 중 한 명은 스포츠 팬일 수도 있고, 다른 한 명은 공직자일 수도 있습니다.

그러므로 먼저 주최자 모델을 구축합니다:

public class Sender 
{   //主办方,此处称为消息发送者}

또한 이러한 신문을 구독하고 싶은 사람들의 모델이 있어야 합니다:

public class Receiver 
{   //订阅报刊的人,此处称为接受者
   private string _name;   private Subject _sub;   public Receiver(string name, Subject sub)
   {       this._name = name;       this._sub = sub;    
   }
}

그리고, 지불 여기 주목하세요, 구독하세요. 신문사에 일하는 사람이 한 명 이상일 수도 있습니다! 모두 다음 신문을 구독하는 사람들의 컬렉션 클래스를 만듭니다.

public class ReceiverCollection
{   //这个集合维护着订阅报刊的人

   //封装一个订阅人的列表
   private List<Receiver> _receivers = new List<Receiver>();   public List<Receiver> ReceiverList
   {     get
     {       return _receivers;
      }
   }    //管理订阅人:增加一个订阅人,移除一个,统计人数
    public void AddReceiver(Receiver r)
    {       this._receivers.Add(r);
    }    public void RemoveReceiver(Receiver r)
    {       if(this._receivers.Contains(r))           this._receivers.Remove(r);       else 
          throw new ArgumentException("此人未订阅此报刊");
    }    public int ReceiverCount
    {       get
       {          return _receivers.Count;
       }
    }

}

좋습니다. 구독자를 관리하기 위한 Organizer 개체 선반, 구독자 개체 및 구독자 컬렉션 개체가 있습니다. 일대다 모델 선반이 설정되었습니다. 다음으로 이러한 개체의 각 동작을 구현해야 합니다.

주최자는 배포하기 전에 누구에게 배포해야 하는지 알아야 한다는 것을 알고 있습니다. 누구에게 보낼지 아는 것 외에도 주최자는 원고, 즉 내용이나 주제 이후에도 생각해야 합니다. 완료되면 다음으로 모든 구독자에게 콘텐츠나 주제를 보내세요!

그렇다면 주최자의 이런 행동은 어떻게 코드로 변하는 걸까요? 기존 선반을 기반으로

public class Sender 
{   //主办方,此处称为消息发送者

   //要知道分发给哪些人
   private ReceiverCollection _receColl;   public Sender(ReceiverCollection receColl)
   {     this._receColl = receColl;
   }   //主办方确定 分发主题
   public List<Subject> SendingSubjects {get; set;}   //主办方通知多个订阅人
    public void Notify()
    {       //执行更新事件
       UpdateEvent();
    }    //因此需要定义一个主办方在通知订阅人时,执行的更新事件
    //事件搭载各类订阅人在收到主题后的行为!!!
    //当事件触发时,回调搭载的各类订阅人收到主题后的行为!!!
    public delegate void MyEventHandler();    public event EventHandler UpdateEvent;
}

배포 테마 주제 모델을

public class Subject
{   //主题话题
   public string Topic {get;set;}   //主题摘要
   public string SubAbstract {get;set;}   //主题内容
   public string Content {get;set;}
}

로 수정합니다. 각 개체 모델과 해당 동작이 작성된 후 이러한 개체를 사용할 수 있습니다.

먼저 주최자는

            ReceiverCollection receColl = new ReceiverCollection();
            Sender sender = new Sender(receColl );
            Subject sportSubject = new Subject()
            {
                Topic = "Sport",
                SubAbstract = "篮球,足球,乒乓球",
                Content = "2018年俄罗斯世界杯,今天晚上国足迎来出线的关键争夺战!"
            };
            sender.SendingSubjects.Add(sportSubject);
            Subject newsSubject = new Subject()
            {
                Topic = "News",
                SubAbstract = "国内大事 国际纵横",
                Content = "十九大,即将召开,请前来参会!"
            };

라는 두 가지 주제를 정의하고 구독자의 인터페이스를 추가하고 두 가지 유형의 구독자 개체를 정의하며 UpdateEvent 이벤트가 트리거되면 콜백이 전달됩니다. 예를 들어 오늘 밤 축구 국가대표팀 경기가 있다는 주제를 본 후 하오하이동은 해당 경기를 시청하게 됩니다.

public interface IResponse
{    void WillDo();   
}public class SportsReceiver:Receiver,IResponse
{   public void WillDo()
   {
      Console.WriteLine("I will watch tv tonight, good luck for gays"); 
   }  public SportsReceiver(string name, Subject subject)
            : base(name, subject)
        {

        }
}public class NewsReceiver:Receiver,IResponse
{   public void WillDo()
   {
      Console.WriteLine("I am going to Beijing to meeting"); 
   }   public NewsReceiver(string name, Subject subject)
            : base(name, subject)
        {

        }
}

주최자는 구독자에게 주제를 보내기 시작합니다.

//添加一位体育大牛:郝海东receColl.AddReceiver(new SportReceiver("Hao Haidong", sender.newsSubjects[0]));
//添加县长:钱烈贤receColl.AddReceiver(new NewsReceiver("Qian Liexian", sender.newsSubjects[1]));

이런 식으로 주최자가 보낸 메시지를 받은 구독자는 WillDo 메서드를 다시 호출합니다. 전체 구독-배포-콜백 프로세스가 종료되었습니다! ! !

위 내용은 C# 디자인 패턴 - 관찰자 패턴의 대체 샘플 코드 요약의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.