당신은 어떻게 효율적으로 구현하는 관찰자의 패턴을 경우 피사체의 거대한 컨테이너?

StackOverflow https://stackoverflow.com/questions/955155

문제

우리 모두 알고 있는 관 패턴:을 주체할 수 있는 통지하고 목록을 업데이트의 관찰자의 상태를 변경합니다.지금 가는 주제하고 싶습을 관찰하는 컨테이너,그리고 당신과 같은 것을 관찰하는 컨테이너체,즉요소를 추가 및 삭제의 요소에,또한 포함되는 요소,즉상태 업데이트의 컨테이너 요소입니다.

당신은 어떻게 업데이트 메커니즘을 구현하도록 빠른 대해 요소의 삽입과 삭제는 보관할 때는 엄청난 양의체에서 당신의 컨테이너?특히,

  • 사 것 같은 종류의 컨테이너에서는 지역의 복사본을 관찰?
  • 이 있 스마트 초이스의 컨테이너는 관찰자 사용해야합니까?(예를 들어,그것은 빠르게하는,말하고,항상 사용하여 균형된 나무 경우에도 당신은 당신을 관찰하는 링크 목록?)
  • 당신은 어떻게 신속하게 번역 반복기으로 관찰 컨테이너로 반복기으로 관찰자의 컨테이너?(사소한 배열,열심히 연결되어 나열?)

는 경우의 컨테이너가 된 목록 예를 들어,다음 삽입할 수 있는 요소는 일정한 시간입니다.만약 m 전문가들을 반복하고 목록을 포함하는 n 요소,그 후 업데이트 소 O(n*m)의 예상 시간.

는 경우의 컨테이너 배열한 다음 변경하는 요소는 일정한 시간 및 업데이트 m 관측 소 O(m)전달하는 경우 요소의 색인,O(n*m)는 경우 관계자가 반복을 통해 배열입니다.

도움이 된다면,다음 예제를 살펴보십시오:

예 1.당신이 쓰는 운영 체제입니다.주제하고 싶습을 관찰하는 파일시스템과 파일이 있습니다.귀하의 전망은 파일 탐색기에는 인덱서,그리고 다른 신청입니다.당신이를 업데이트하고 싶은 관측면 파일을 추가,삭제나 수정할 수 있습니다.

예제 2.쓰고 있는 주소 예약 응용 프로그램을 처리할 수 있어야 합니다 도시의 크기는 뉴욕.주제하고 싶습을 관찰하는 컨테이너의 기록(사람이 그의 주소,전화번호,이메일,...).당신의 관찰자들은 여러 가지 전망해야 업데이트할 때 자동으로 추가,삭제하거나 수정할 수 있다.(수 있는 하나 이미지 하나의 보기를 포함하는 사람들의 목록에서 라이브 53 고 다른 점을 그려지도에서 각 사람에 대한 그의 이름은 Doe).

을 어떻게 처리하는 완전한 디렉토리-하위트리 삭제하거나는"53rd St"이름이"트라 St"?

도움이 되었습니까?

해결책

게 설정해야 합 컨테이너로 주제입니다.

주요 문제는 여기에서 찾을 수 있는 효율적인 방법을 통 변경합니다.대부분의 시간을 실행하면으로 이 문제는,그것의 원하는 것을 관찰하는 제공하지 않는 효율적인 알림 메커니즘은(아마도 때문에서 관찰자의 디자인 패턴을 발명되지 않았을 때 그 일을 작성되었).

[편집]기후 불안정은 우리 문명에 대해 효율적인 방법으로,일반적인 대답이"그것은 다릅니다.".디자인 패턴은 없다"one-size-fits-all"솔루션입니다.그들은 일반 규칙에 어떻게 접근하는 문제입니다.당신이 어떻게 구현해야 할 규칙을 특정 상황에서 무언가를 해결하에 있을 때는 상황이다.

일반적으로는 경우,귀하의 관계자를 식별해야 작은 변화(예:특성의 변경 또는 성분을 추가하는)알림 메시지가 포함해야 충분한 정당한 의견이나 불만을 반영하고 그 이것을 할 수 있습니다.그래서 만약 당신이트 및 삽입,목록을 보내고 인덱스의 새로운 요소의 플러스"항목을 삽입".

로에 대한 특성의 변화,두 가지 솔루션입니다.하나를 추가하는 관찰자의 모든 요소가 목록에 있습니다.이 속도가 느려질 수 있습니다 많이 필요 RAM 하지만 그것을 추가할 수 있음을 의미합니다 여러 가지 유형으로 동일한 목록입니다.

또는,당신이 할 수 있는"수정 항목 목록 서비스"입니다.이 의미는 그것의 금지를 변경하는 항목을 직접해야 합니다 항상 서비스를 사용할 수 있습니다.이 서비스는 다음 작업을 대상으로서 및 알림을 보내는 항목과 함께,이전 및 변경된 값과 가능성을 인덱스 목록에 있습니다.

[EDIT2]의 일반 규칙을 수집하는 것으로 많은 정보에 대한 변경을 가능한 통과하는 관찰자입니다.하지만 정말에 따라 특정 문제입니다.말하자는 관찰자에 앉아서 원격 컴퓨터입니다.이 경우에는,아무 효율적인 방법을 보내 전체 목록을 확인합니다.할 수 있습만 보내는 그것을"항목 X 삽입된"희망으로 충분합니다.컨테이너 경우 방법이 없습니다 변경(예를 들어,새로운 웹 페이지에 웹 사이트),용기를 통과 전체 사이트에 다시 다시 찾을 변경할 수 있는 다음을 말해 관계자에서 효율적인 방식이다.

다시 세부 정보 정말 특정 상황에 따라 다릅.Google 실천의 웹 거미는 방문한 웹 페이지의 수백만 매 시간마다.오랜 시간 이었다"효율적인"("에서와 같이 유일한 방법은").얼마 전에는"사이트 맵"프로토콜 구현할 수 있는 관리자를 차례로 그들의 웹 사이트 과목으로 말할 수 있는 구글 관찰자에 대한 변경합니다.

그렇지 않으면 당신을 줄 수 있는 더 구체적인 예는 무엇을 해야 할 필요하지 않습니다 당신은 더 구체적인 대답이다.디자인 패턴이 필요 앉아서,진짜 문제고 전원을 켭니다.

[EDIT3]여기에 몇가지 예를 들어 사용에 대한 관찰자의 패턴:

  • 많은 UI 프레임워크를 이용한 패턴을 확산에 이벤트를 관심 있는 당사자.에서는 Qt,당신은 중앙 자는 모든 과목을 등록 할 수 있습니다 그들의 신호(알림을 보낼 것이)어디서 관측할 수 있는 첨부하는 과목입니다.이 있다는 것을 의미의 단점은 모든 연결을 관리할 수 있습니다.이점은 당신을 추가하지 않고 이는 데이터 구조는 모든 개체입니다.또한,객체에서 외부로(비 Qt 개체)메시지를 보내고 받을 수 있습니다.이후 모든 것을 한 곳에서,이러한 데이터 구조 최적화할 수 있습니다 쉽습니다.단점은 이 구조가 될 수 있는 그래서 매우 큰 메시지를 보내는 것입니다 더 많은 시간이 걸릴 때 더 많은 관련된 당사자들(심지어는 완전히 무관).

  • Google 사이트맵 프로토콜을 사용하는 차례 웹 사이트 과목으로 이는 보다 훨씬 더 효율적과 전체 사이트에 다시 다시는 경우에도 당신은 단지 요청의 최근 수정시간 URL(HTTP 머리를 대신 HTTP 얻).

  • 파일시스템 Windows 및 Linux 에서 제공하는지 알 응용 프로그램에 대한 새로운 또는 삭제된 파일이 있습니다.주요 문제가 여기에 무엇 때 일어나야 하는 파일이 변경되면서 응용 프로그램 실행되지 않습니다.말이 있는 응용 프로그램을 유지하의 디스크 파일에 디렉토리에 있습니다.분명히,당신은 당신에 대해 알고 싶 변경할 때 응용 프로그램지는 것을 의미 알림 서비스의 마지막 그것을 변경 전송됩니다.그래서 여기에,응용 프로그램을 읽기 전에 나무에서 시작하여 아무것도 볼것을 놓칠 수 있고 그것을 사용할 필요가 관찰자에 대한 패턴 일어나는 변화하는 동안 실행됩니다.

  • 메일 클라이언트는 관찰자.그것은 말할 것이는 메일 서버의 ID 를 마지막 이메일 그것을 보고 서버는 그것을 말해에 대해 어떤 새로운 것들입니다.

  • 할 때가 많이의 특성을 변경하에서 복잡한 모델,그것은 일반적으로 유일한 방법은 중앙 집중화의 모든 변경(그들에게 실행을 통해 하나의 장소)와 첨부 관계자가(붙이는 대신 N 관측 M 의 개별 개체).이 구현에서 관측할 수 있는 말은"나에게 관심에 어떤 변화를 어디서"또는"의 변화에 어떤 주제"또는"어떤 변화에서 주제 Y"(마지막 중 하나는 일반적으로 복식"으로의 변경에 주 Y"-관찰자는 단순히 무시하는 변화를 분야!= X).

다른 팁

관찰자 패턴 자체가 아닌 이유는 무엇입니까?

주제는 관찰자에게 흥미로운 사건에 대해 알릴 필요가 있습니다. 그런 다음 관찰자는이를 이해 당사자 (가입자)에게 파견해야합니다.

주제의 본질은 여기서는 의미가 없습니다. (내가 당신의 질문을 잘못 이해하지 않는 한).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top