23 디자인 모드 의 관찰자 모드 (Observer)

디 렉 터 리 되 돌리 기
개술
Observer 는 행동 형 모드 중 하나 로 대상 간 의 다 중 의존 관 계 를 정의 합 니 다. 대상 의 상태 가 바 뀌 면 모든 의존 대상 이 알림 을 받 고 자동 으로 업 데 이 트 됩 니 다.
2 적용 성
  • 추상 적 인 모델 은 두 가지 측면 이 있 는데 그 중 하 나 는 다른 한편 에 의존한다.이 두 가 지 를 독립 된 대상 에 봉 하여 각자 독립 적 으로 바 꾸 고 재 활용 할 수 있 도록 하 다.
  • 한 대상 에 대한 변화 가 다른 대상 을 동시에 바 꿔 야 할 때 구체 적 으로 얼마나 많은 대상 이 바 뀌 어야 할 지 모른다.
  • 한 대상 이 다른 대상 에 게 알려 야 하 는데 다른 대상 이 누구 인지 가정 할 수 없다.

  • 3 참가 자
  • Subject (목표): 목표 가 그것 을 아 는 관찰자.여러 명의 관찰자 가 같은 목 표를 관찰 할 수 있다.관찰자 대상 을 등록 하고 삭제 하 는 인 터 페 이 스 를 제공 합 니 다.
  • Observer (관찰자): 목표 가 바 뀌 었 을 때 알림 을 받 아야 하 는 대상 에 게 업데이트 인 터 페 이 스 를 정의 합 니 다.
  • Concrete Subject (구체 적 인 목표): 관련 상 태 를 각 Concrete Observer 대상 에 저장 합 니 다.그것 의 상태 가 바 뀌 었 을 때, 그것 의 각 관찰자 에 게 통 지 를 보 냅 니 다.
  • Concrete Observer (구체 적 인 관찰자): Concrete Subject 대상 을 가리 키 는 인용 을 유지 합 니 다.관련 상 태 를 저장 하려 면 이러한 상 태 는 목표 의 상태 와 일치 해 야 한다.Observer 의 업데이트 인 터 페 이 스 를 실현 하여 자신의 상태 와 목표 의 상 태 를 일치 시 킵 니 다.

  • 분류 도
    5 코드 구현
    //
    // YJObserver.swift
    // DesignPattern
    //
    // CSDN:http://blog.csdn.net/y550918116j
    // GitHub:https://github.com/937447974/Blog
    //
    // Created by yangjun on 15/11/27.
    // Copyright © 2015    . All rights reserved.
    //
    
    import Cocoa
    
    /// PolicemanProtocol(   )                           。
    private protocol PolicemanProtocol {
    
        func action(citizen:Citizen)
    
    }
    
    /// HuangPuPoliceman     
    private class HuangPuPoliceman: PolicemanProtocol {
    
        func action(citizen: Citizen) {
            switch (citizen.help) {
            case "normal":
                print("    ,     !")
            case "unnormal":
                print("     ,       !")
            default:
                print("default...")
            }
        }
    }
    
    /// HuangPuPoliceman     
    private class TianHePoliceman: PolicemanProtocol {
    
        func action(citizen: Citizen) {
            switch (citizen.help) {
            case "normal":
                print("    ,     !")
            case "unnormal":
                print("     ,       !")
            default:
                print("default...")
            }
        }
    
    }
    
    // MARK: - 
    
    /// Citizen(  )         。                 。               
    private class Citizen {
    
        ///      
        var pols: [PolicemanProtocol] = []
        ///     
        var help: String = "normal"
    
        // MARK:     
        func sendMessage(help: String) {
    
        }
    
        // MARK:   
        func register(pol: PolicemanProtocol) {
            self.pols.append(pol);
        }
    
    }
    
    ///        HuangPuCitizen  。          ,            
    private class HuangPuCitizen: Citizen {
    
        init(pol: PolicemanProtocol) {
            super.init()
            self.register(pol)
        }
    
        override func sendMessage(help: String) {
            self.help = help
            for pol in self.pols {
                //      
                pol.action(self)
            }
        }
    
    }
    
    ///        TianHeCitizen  。          ,            
    private class TianHeCitizen: Citizen {
    
        init(pol: PolicemanProtocol) {
            super.init()
            self.register(pol)
        }
    
        override func sendMessage(help: String) {
            self.help = help
            for pol in self.pols {
                //      
                pol.action(self)
            }
        }
    
    }
    
    // MARK: -
    
    ///      
    class YJObserver: YJTestProtocol {
    
        func test() {
            let hpPol = HuangPuPoliceman()
            var citizen:Citizen = HuangPuCitizen(pol: hpPol)
            citizen.sendMessage("unnormal")
            let thPol = TianHePoliceman()
            citizen = TianHeCitizen(pol: thPol)
            citizen.sendMessage("normal")
        }
    
    }

     
    기타
    소스 코드
    Framework
    문서 수정 기록
    시간.
    묘사 하 다.
    2015-11-27
    박문 완성
    판권 소유
    CSDN:http://blog.csdn.net/y550918116j
    GitHub:https://github.com/937447974/Blog

    좋은 웹페이지 즐겨찾기