c\#타이머 와 관찰자 모드 를 사용 하여 경보 푸 시 수 요 를 실현 합 니 다.

머리말
이틀 동안 한 사물 인터넷 회사 의 고급 연구 개발 을 면접 보 았 는데 면접 문 제 는 다음 과 같다.
회사 지도자,부서 주관,팀장,팀 원 4 급,전염병 경보 가 있 으 면 팀 원 에 게 먼저 통지 하고(개인 에 게 는 주로 한 가지 처리 가 있 으 면 처리)3 분 동안 처리 하지 않 으 면 팀장 에 게 문 자 를 보 내 고 팀장 이 3 분 동안 처리 하지 않 으 면 상부 로 전송 한다.한 등급 한 등급.단일 프로그램 병행 최소 1000 tps 조기 경보 지원 요청
솔직히 위 에서 필요 한 것 은 내 가 한 과거 프로젝트 에서 비슷 한 수요 가 있 었 고 나 도 내 가 어떻게 했 는 지 어렴풋이 기억 할 뿐이다.제3자 퀘 스 트 스케줄 링 프레임 워 크 를 사용 하여 위의 3 분 초과 처 리 를 완성 한 다음 에 등급 별 발송 은 더욱 간단 하 다.더 이상 if,else 와 같은 가장 원시 적 인 검증 을 사용 하면 된다.근 데 이런 문 제 를 면접 문제 에 던 져 서 당 황 스 러 웠 어 요.자연 최종 결과 도 만 족 스 럽 지 못 하 다.
수요 분석
며칠 이 지나 도 손 으로 코드 를 훑 어야 한다 고 생각 합 니 다.그렇지 않 으 면 어떻게 성장 합 니까?
수 요 를 분리 해서 얻 을 수 있 는 소식 은 한 가지 사건 이 있다.이 사건 은 바로 신고 사건 이다.신고 사건 을 통 해 서로 다른 직위 의 직원 에 게 정 보 를 전달 해 야 하고 직무 에 따라 아래 에서 위로 해 야 한다.그러나 직원 이 신고 소식 을 받 으 면 신고 통지 가 이미 완성 되 었 다 고 표시 하고 그 다음 에 3 분 동안 처리 해 야 한다.
위의 수요 분석 을 통 해 우 리 는 반드시 매 거 진 것 을 정의 하고 직명 의 높 고 낮 음 을 기록 해 야 한 다 는 것 을 알 수 있다.

  /// <summary>
  ///     
  /// </summary>
  public enum JobLevel : int
  {
         = 1,
         = 2,
         = 3,
        = 4
  }
그 다음 에 우 리 는 적어도 두 가지 유형 이 존재 한다.하 나 는 신고 대상 이다.이 대상 은 통지 해 야 할 신고 정보 와 신고 정보 발송 결과 가 있 기 때문에 당연히 우리 가 신고 메 시 지 를 구독 한 구독 자가 빠 질 수 없다.여기 서 생각해 보 니 관찰자 디자인 모델 로 결합 을 풀 수 있 습 니 다.

  /// <summary>
  ///      
  /// </summary>
  public interface IPublish
  {
    /// <summary>
    ///      (   )
    /// </summary>
    /// <param name="subscriber"></param>
    void AddSubscriber(SubscriberPeopleBase subscriber);
 
    /// <summary>
    ///      (   )
    /// </summary>
    /// <param name="subscriber"></param>
    void RemoveSubscriber(SubscriberPeopleBase subscriber);
 
    /// <summary>
    ///       
    /// </summary>
    void SendNotify();
  
    /// <summary>
    ///     
    /// </summary>
    /// <param name="msg">    </param>
    void CreateJB(string msg);
다음은 위의 인 터 페 이 스 를 실현 하 는 것 이다!

/// <summary>
///      
/// </summary>
public class Baojing : IPublish
{
    /// <summary>
    ///      
    /// </summary>
    public List<SubscriberPeopleBase> SubscriberLst { get; set; }
 
    /// <summary>
    ///     
    /// </summary>
    public string Msg { get; set; }
 
    /// <summary>
    ///       
    /// </summary>
    public bool IsSucess { get; set; }
 
    /// <summary>
    ///        
    /// </summary>
    public Timer NotifyTimer { get; set; }
 
    /// <summary>
    ///            
    /// </summary>
    public JobLevel CurrentJobLevel = JobLevel.   ;
 
    public void AddSubscriber(SubscriberPeopleBase subscriber)
    {
      if (SubscriberLst == null) SubscriberLst = new List<SubscriberPeopleBase>();
      SubscriberLst.Add(subscriber);
    }
 
    public void CreateJB(string msg)
    {
      Msg = msg;
    }
 
    public void RemoveSubscriber(SubscriberPeopleBase subscriber)
    {
      if (SubscriberLst != null) SubscriberLst.Remove(subscriber);
    }
 
 
    /// <summary>
    ///       
    /// </summary>
    public void SendNotify()
    {
      if (SubscriberLst?.Count > 0)
      {
        //        
        SubscriberLst.OrderByDescending(p => (int)p.Title);  
         //    CheckNotifySendResult,  3    
        NotifyTimer = new Timer(CheckNotifySendResult, null, 0, 3000);       
      }
    }
 
    public void CheckNotifySendResult(object stat)
    {
      //       ,    
      NotifyTimer.Change(-1, 3000);
      //                  
      SubscriberPeopleBase subscriberPeople = SubscriberLst.Find(p =>
       (((int)CurrentJobLevel + 1) - (int)p.Title) == 1);
      if (subscriberPeople == null) return; //      
      if (!IsSucess)
      {
        IsSucess = subscriberPeople.ReceiveData(this);
        if (!IsSucess)
        {
          CurrentJobLevel = CurrentJobLevel!= JobLevel.    ?(JobLevel)((int)CurrentJobLevel) - 1: JobLevel.    ;
          NotifyTimer.Change(3000, 3000);
        }
      }
      else
      {
        Console.WriteLine($"      {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}");
        NotifyTimer.Dispose();
      }
    }
  }
구독 자가 필요 합 니 다.구독 자 는 추상 적 인 방식 으로 결합 성 을 낮 춰 야 합 니 다.(사실은 이벤트 버스 를 사용 하여 결합 성과 확장 성 을 한 단계 높 여야 합 니 다)

 /// <summary>
  ///    
  ///          ,                                            ,
  ///                  ,        ,         
  /// </summary>
  public abstract class SubscriberPeopleBase
  {
    /// <summary>
    ///     (  )
    /// </summary>
    public JobLevel Title { get; set; }
 
    public SubscriberPeopleBase(JobLevel title)
    {
      Title = title;
    }
 
    public virtual bool ReceiveData(Baojing baojing)
    {
      if (Title == JobLevel.    )
      {
        Console.WriteLine($"      :{baojing.Msg},     :{Title.ToString()} {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}");
        return true;
      }
      else
      {
        Console.WriteLine($"      :{baojing.Msg},     :{Title.ToString()},      {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}");
        return false;
      }
    }
  }
하위 클래스 를 더 해 경 보 를 받 는 방법 을 다시 쓰 세 요.

public class SubscriberPeople : SubscriberPeopleBase
 {
    public SubscriberPeople(JobLevel title) : base(title) { }
    public override bool ReceiveData(Baojing baojing)
    {     
      if (Title == JobLevel.    )
      {
        Console.WriteLine($"        :{baojing.Msg},     :{Title.ToString()}       {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}");
        return true;
      }
      else
      {
        Console.WriteLine($"      :{baojing.Msg},     :{Title.ToString()},      {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}");
        return false;
      }
    }
 }
결국 저의 메 인 방법 은 이 렇 습 니 다.

 static void Main(string[] args)
 {
      IPublish publish = new Baojing();
      publish.AddSubscriber(new SubscriberPeople(JobLevel.   ));
      publish.AddSubscriber(new SubscriberPeople(JobLevel.    ));
      publish.AddSubscriber(new SubscriberPeople(JobLevel.    ));
      publish.AddSubscriber(new SubscriberPeople(JobLevel.    ));
      publish.CreateJB("      !");
      publish.SendNotify();
      Console.ReadLine();
  }
디 버 깅 효 과 는 다음 과 같 습 니 다.

내일 도 보완 하에 EventBus 를 사용 하여 결합 성 을 다시 낮 추 는 동시에 수신 방법 을 더욱 유연성 있 게 하고 서로 다른 등급 의 직원 들 이 서로 다른 응답 을 할 수 있 습 니 다!
이상 은 c\#타이머 와 관찰자 모드 를 사용 하여 경보 푸 시 수 요 를 실현 하 는 상세 한 내용 입 니 다.c\#경보 푸 시 수 요 를 실현 하 는 자 료 는 우리 의 다른 관련 글 을 주목 하 세 요!

좋은 웹페이지 즐겨찾기