옵저버 모드 (때로는 게시 수용 모드, 모델 뷰 모드, 소스 리스너 모드 또는 슬레이브 모드라고도 함)는 소프트웨어 설계 모드 유형입니다. 이 모드에서 대상 객체는 이에 의존하는 모든 관찰자 객체를 관리하고 상태가 변경 될 때 알림을 적극적으로 발행합니다. 이것은 일반적으로 각 관찰자의 방법을 호출하여 달성됩니다. 이 패턴은 일반적으로 이벤트 처리 시스템을 구현하는 데 사용됩니다.
관찰자 모드는 관찰 된 물체와 옵저버를 완벽하게 분리합니다. 예를 들어, 사용자 인터페이스는 관찰자로 사용할 수 있으며 비즈니스 데이터는 관찰자입니다. 사용자 인터페이스는 비즈니스 데이터의 변경 사항을 관찰합니다. 데이터의 변경 사항을 발견하면 인터페이스에 표시됩니다. 객체 지향 설계의 한 가지 원칙은 시스템의 각 클래스가 다른 측면이 아닌 한 기능에 초점을 맞추는 것입니다. 사람은 한 가지만하고 잘합니다. 관찰자 모드는 모듈간에 명확한 경계를 그려 응용 프로그램의 유지 관리 및 재사용 성을 향상시킵니다.
옵저버 설계 패턴은 객체의 상태가 변경되면 객체의 상태가 변경되면 이에 의존하는 모든 객체에 알림을 받고 자동으로 새로 고침되도록 정의합니다.
구현 방법 :
관찰자 패턴을 구현하는 방법에는 여러 가지가 있으며 기본적으로 패턴에는 관찰자와 관찰되는 물체의 두 가지 역할이 포함되어야합니다. 예제에서 지금은 비즈니스 데이터가 관찰 할 객체이며 사용자 인터페이스는 관찰자입니다. 관찰자와 관찰자 사이에는 논리적 관계가 있습니다. 관찰자가 변경되면 관찰자는 그러한 변화를 관찰하고 그에 따라 응답합니다. 이러한 관찰 프로세스가 사용자 인터페이스와 비즈니스 데이터 사이에 사용되는 경우 인터페이스와 데이터 사이의 경계가 그려지는지 확인할 수 있습니다. 응용 프로그램의 요구가 변경된다고 가정하면 인터페이스의 성능을 수정해야합니다. 사용자 인터페이스 만 재구성해야하며 비즈니스 데이터를 변경할 필요가 없습니다.
1. 관찰자
(관찰자)는 주제에 자체적으로 등록하고 관찰 된 물체는 관찰자를 컨테이너에 저장합니다.
2. 관찰되고 있습니다
관찰되는 물체에는 약간의 변화가 있으며 (그림의 SomeChange에 표시된 것처럼) 등록 된 모든 관찰자는 컨테이너에서 얻어지고 변경 사항을 관찰자에게 알립니다.
3. 관찰을 철회합니다
관찰자는 관찰자에게 관찰을 취소하고 컨테이너에서 관찰자를 제거하도록 지시합니다.
관찰자가 관찰자의 용기에 자신을 등록하면 관찰자는 특정 유형의 관찰자에 대해 묻지 말고 관찰자의 인터페이스를 사용해야합니다. 이 장점은 다음과 같습니다.이 관찰자가 동일한 인터페이스에 의해 구현되는 한 프로그램에 다른 관찰자가 있다고 가정합니다. 관찰되는 사람은 여러 관찰자에 해당 할 수 있습니다. 관찰 된 사람이 변경되면 모든 관찰자에게 하나씩 알릴 수 있습니다. 특정 구현이 아닌 인터페이스를 기반으로합니다. 이는 프로그램에 대한 유연성을 더 많이 제공합니다.
데모 코드 :
관찰 될 추상 클래스 역할을 정의하십시오.
패키지 test.edu.mainrole; java.util.arraylist 가져 오기; 공개 초록 클래스 Absrole {private arraylist <iobserver> list = new arraylist <iobserver> (); public void add (iobserver observer) {list.add (옵저버); } public void delete (iobserver observer) {list.remove (옵저버); } public void nodifyObservers (String Newstate) {for (iobserver observer : list) {Observer.update (Newstate); }}} 관찰 된 역할 서브 클래스 :
패키지 test.edu.mainrole; 공개 클래스 역할은 압축 {private String State; 공개 문자열 getState () {return state; } public void Change (String nupdate) {state = nupdate; this.nodifyobservers (State); }} 관찰자 인터페이스 정의 :
패키지 test.edu.mainrole; 공개 인터페이스 iobserver {public void update (String Newstate); } 특정 관찰자 :
패키지 test.edu.mainrole; Public Class ObserverObj1은 iobserver {private String observerstate; @override public void update (String State) {ObserverState = state; System.out.println ( "관찰자 1의 상태는 다음과 같습니다." + Observerstate); }} 패키지 test.edu.mainrole; 공개 클래스 옵저버 로즈 2는 iobserver {private string observerstate; @override public void update (String State) {ObserverState = state; System.out.println ( "관찰자 2의 상태는 다음과 같습니다." + 옵저버 스테이트); }} 클라이언트 테스트 :
패키지 test.edu.mainrole; 공개 클래스 클라이언트 { / ** * @param args * / public static void main (String [] args) {역할 주제 = new Role (); IOBSERVER OBSERVER1 = NEW OBSERVEROBJ1 (); IOBSERVER OBSERVER2 = NEW OBSERVEROBJ2 (); 대상 add (Observer1); 대상 add (Observer2); 대상체 ( "업데이트!"); }} 실행 결과 :
관찰자 1은 : 업데이트입니다! 관찰자 2의 상태는 : 업데이트입니다!
위의 내용은이 기사에 관한 모든 것이며, 그것이 당신이 배우도록 영감을주기를 바랍니다.