관찰자 모드 [C \ #]

예제 코드 는 디자인 모델 의 특징 을 최대한 돋 보이 게 하기 위해 미니 코드 를 사용 했다.다른 코드 가 디자인 모델 을 이해 하 는 데 방해 가 되 지 않도록 하 세 요.
정의.
대상 간 의 다 중 의존 관 계 를 정의 합 니 다. 대상 의 상태 가 바 뀌 었 을 때 모든 의존 대상 이 알림 을 받 고 자동 으로 업 데 이 트 됩 니 다.
한 마디 로 하면 관찰자 모델 은 피 관찰자 의 특정한 동작 이 실 행 될 때 해당 하 는 관찰자 에 게 알려 줄 수 있다.관찰자 들 로 하여 금 즉시 상응하는 반응 을 할 수 있 게 하 다.
구조 도
예시 항목 약술
예시 코드 의 대략적인 의 도 는 사실 다운로드 기 를 실현 하 는 것 이다.지정 한 파일 다운로드 가 완료 되면 관찰자 들 에 게 각자 의 수요 에 따라 다운로드 한 파일 을 처리 할 수 있 도록 알려 준다.
다음은 구체 적 인 코드 를 보십시오.
코드
추상 관찰자
/// 
///      
/// 
interface IObserver
{
    void DoUpdate();
}

사실 이 추상 적 인 관찰 자 는 단지 간단 한 인터페이스 일 뿐이다.모든 구체 적 인 관찰자 들 은 그것 을 계승 할 것 이다.
구체 적 관찰자
/// 
///      -       ,    。
/// 
class Observer1 : IObserver
{
    public void DoUpdate()
    {
        Console.WriteLine("   1      。");
    }
}

/// 
///      -       ,    。
/// 
class Observer2 : IObserver
{
    public void DoUpdate()
    {
        Console.WriteLine("   2      。");
    }
}

/// 
///      -       ,    。
/// 
class Observer3 : IObserver
{
    public void DoUpdate()
    {
        Console.WriteLine("   3           。");
    }
}

이상 은 세 명의 간단 한 구체 적 인 관찰자 이다.그들 은 각각 의 통 지 를 받 은 후에 파일 을 백업 하고 압축 하 며 전송 한다.
관찰자 들 이 준 비 를 마 쳤 으 니 피 관찰자 차례 다.
피 관찰자
일반적으로 피 관찰 자 는 상대 적 으로 복잡 하 다.어떤 동작 을 수행 하 는 방법 뿐만 아니 라 등록 및 로그아웃 관찰자 의 방법 도 제공 해 야 하기 때문이다.피 관찰자 가 생 성 된 후에 먼저 필요 한 관찰 자 를 연결 해 야 합 니 다 (필요 하 다 면).관찰자 들 이 귀속 에 성공 하면 이 관찰자 목록 은 관찰자 에 의 해 유지 된다.피 관찰자 의 어떤 동작 이 실 행 된 후에 관찰자 에 게 알려 야 한다 면 이 관찰자 목록 을 통 해 알려 야 할 모든 관찰자 에 게 차례대로 알려 줄 수 있다.
/// 
///      -    
/// 
class Downloader
{
    /// 
    ///      
    /// 
    public readonly HashSet observers;

    public Downloader()
    {
        observers = new HashSet();
    }

    /// 
    ///      
    /// 
    public bool AddObserver(IObserver _observer)
    {
        return observers.Add(_observer);
    }

    /// 
    ///      
    /// 
    public bool RemoveObserver(IObserver _observer)
    {
        return observers.Remove(_observer);
    }

    /// 
    ///   
    /// 
    public void Download()
    {
        Console.WriteLine("      。");
        Console.WriteLine("     ···");
        Thread.Sleep(3000);//            
        Console.WriteLine("      。");
        foreach (var observer in observers)
        {
            observer.DoUpdate();
        }
    }
}

위의 코드 에서 Download 방법 에서 파일 다운로드 가 성공 하면 관찰자 목록 을 옮 겨 다 니 며 해당 하 는 관찰자 에 게 하나씩 알려 준다. 클 라 이언 트
클 라 이언 트 코드 보 세 요.
//       
var downloader = new Downloader();

//      
var o1 = new Observer1();
var o2 = new Observer2();
var o3 = new Observer3();

//      
downloader.AddObserver(o1);
downloader.AddObserver(o2);
downloader.AddObserver(o3);

//   
downloader.Download();

피 관찰자 대상 을 만 들 고 세 명의 관찰 자 를 등록 합 니 다.등록 에 성공 하면 파일 을 다운로드 하 는 동작 을 수행 할 수 있 습 니 다.파일 다운로드 가 완료 되면 Download 방법 내부 에서 성공 적 으로 등 록 된 관찰자 들 에 게 알 립 니 다.
실행 결과
보다 시 피 의 통 지 를 보 낸 후에 각 관찰자 들 은 각자 의 작은 동작 을 시작 했다. 각각 백업, 압축, 퍼 가기 이다.
총결산
관찰자 들 자체 에 공공 적 인 추상 적 인 관찰자 가 있 기 때문에 특정한 관찰자 가 변동 이 필요 할 때 이 관찰 자 를 버 리 고 다른 새로운 관찰 자 를 만 들 수 있 으 며 기 존의 어떠한 관찰 도 바 꾸 지 않 아 도 된다.따라서 이런 측면 에서 볼 때 관찰자 모델 은 개폐 원칙 에 부합된다.이상 은 미니 멀리 즘 관찰자 모델 의 모든 내용 입 니 다.

좋은 웹페이지 즐겨찾기