관찰자 패턴은 행동 디자인 패턴입니다. 관찰자 패턴은 객체의 상태에 관심이 있고 객체가 변경될 때마다 알림을 받고 싶을 때 사용됩니다. 관찰자 패턴에서는 다른 객체의 상태를 관찰하는 객체를 Observer라고 하고, 관찰되는 객체를 Subject라고 합니다. GoF 규칙에 따르면 관찰자 패턴의 의도는 다음과 같습니다.
다음과 같이 코드 코드를 복사합니다.
객체 간의 일대다 종속 관계를 정의합니다. 객체의 상태가 변경되면 다른 관련 객체에 알림이 전달되고 자동으로 업데이트됩니다.
주체에는 상태가 변경될 때 알림을 받아야 하는 관찰자가 포함되어 있습니다. 따라서 관찰자에게 자신을 등록하고 등록을 취소하는 방법을 제공해야 합니다. 관찰된 주체(Subject)가 변경되면 모든 관찰자에게 알리는 방법도 포함되어야 합니다. 관찰자에게 알릴 때 업데이트를 푸시하거나 업데이트를 얻을 수 있는 다른 방법을 제공할 수 있습니다.
관찰자는 관찰자 개체를 설정하고 관찰자가 업데이트를 알리는 데 사용할 수 있는 메서드를 가지고 있어야 합니다.
JAVA는 관찰자 패턴, java.util.Observable 및 java.util.Observer 인터페이스를 구현하는 내장된 방법을 제공합니다. 그러나 그다지 널리 사용되지는 않습니다. 이 구현은 너무 간단하기 때문에 대부분의 경우 마지막 확장 클래스가 관찰자 패턴만 구현하는 것을 원하지 않습니다. JAVA 클래스는 여러 번 상속할 수 없기 때문입니다.
JMS(Java Messages Service) 메시지 서비스는 관찰자 모드와 명령 모드를 사용하여 서로 다른 프로그램 간의 데이터 게시 및 구독을 실현합니다.
MVC 모델-뷰-제어 프레임워크는 관찰자 패턴을 사용하여 모델을 관찰자로, 뷰를 관찰자로 처리합니다. 뷰는 모델에 대한 변경 사항을 수신하기 위해 모델에 자신을 등록할 수 있습니다.
관찰자 패턴 예
이 예에서는 간단한 주제 토론을 완료하고 관찰자는 이 주제에 등록할 수 있습니다. 이 주제에 대한 콘텐츠 제출로 인한 모든 변경 사항은 등록된 모든 관찰자에게 통보됩니다.
이는 주제 관찰자의 요구에 따라 기본 주제 인터페이스를 구현하는 것입니다. 이 인터페이스는 이후에 인터페이스를 구현하는 특정 클래스에서 구현되어야 하는 일련의 특정 메소드를 지정합니다.
다음과 같이 코드 코드를 복사합니다.
패키지 com.journaldev.design.observer;
공개 인터페이스 제목 {
//관찰자를 등록 및 등록 취소하는 방법
공개 무효 레지스터(Observer obj);
공개 무효 등록 취소(관찰자 obj);
//관찰자에게 변경 사항을 알리는 방법
공공 무효 통지Observers();
//주제로부터 업데이트를 얻는 방법
공개 객체 getUpdate(Observer obj);
}
이제 연결된 관찰자를 만듭니다. 관찰자에게 주체를 연결하는 방법이 필요합니다. 추가 방법으로 제목 변경 알림을 받을 수 있습니다.
다음과 같이 코드 코드를 복사합니다.
패키지 com.journaldev.design.observer;
공개 인터페이스 관찰자 {
//객체가 사용하는 관찰자를 업데이트하는 방법
공개 무효 업데이트();
//관찰 대상과 함께 첨부
public void setSubject(주제 하위);
}
이 연결이 설정되었습니다. 이제 구체적인 테마를 구현해 보세요.
다음과 같이 코드 코드를 복사합니다.
패키지 com.journaldev.design.observer;
import java.util.ArrayList;
java.util.List 가져오기;
공개 클래스 MyTopic은 주제 {를 구현합니다.
private List<Observer> 관찰자;
개인 문자열 메시지;
개인 부울이 변경되었습니다.
개인 최종 객체 MUTEX= new Object();
공개 MyTopic(){
this.observers=new ArrayList<>();
}
@보수
공개 무효 레지스터(관찰자 obj) {
if(obj == null) throw new NullPointerException("Null Observer");
if(!observers.contains(obj)) 관찰자.add(obj);
}
@보수
공개 무효 등록 취소(관찰자 obj) {
관찰자.제거(obj);
}
@보수
공공 무효 통지Observers() {
List<Observer> 관찰자Local = null;
//메시지 수신 후 등록된 관찰자에게 알림이 전달되지 않도록 하기 위해 동기화가 사용됩니다.
동기화됨(MUTEX) {
만약 (!changed)
반품;
observersLocal = new ArrayList<>(this.observers);
this.changed=false;
}
for (관찰자 obj : 관찰자Local) {
obj.update();
}
}
@보수
공개 객체 getUpdate(Observer obj) {
this.message를 반환하세요.
}
//주제에 메시지를 게시하는 방법
공개 무효 postMessage(문자열 메시지){
System.out.println("주제에 게시된 메시지:"+msg);
this.message=msg;
this.changed=true;
통지관찰자();
}
}
관찰자 메소드 등록 및 등록 취소의 구현은 매우 간단합니다. 추가 메소드 postMessage()는 클라이언트가 이 주제에 문자열 메시지를 제출하는 데 사용됩니다. 부울 변수는 주제 상태의 변경 사항을 추적하고 관찰자에게 그러한 변경 사항을 알리는 데 사용됩니다. 업데이트가 없는데 누군가 informObservers() 메서드를 호출하면 관찰자에게 오류 알림 정보를 보낼 수 없기 때문에 이 변수가 필요합니다.
또한 메시지가 주제에 게시되기 전에 등록된 관찰자에게만 알림을 보낼 수 있도록 하기 위해 informObservers()에서 동기화가 사용된다는 점에 유의해야 합니다.
다음은 관찰자의 구현입니다. 그들은 항상 주제 대상에 집중할 것입니다.
다음과 같이 코드 코드를 복사합니다.
패키지 com.journaldev.design.observer;
공개 클래스 MyTopicSubscriber는 Observer를 구현합니다.
개인 문자열 이름;
비공개 주제 주제;
공개 MyTopicSubscriber(문자열 nm){
this.name=nm;
}
@보수
공개 무효 업데이트() {
String msg = (String) topic.getUpdate(this);
if(msg==null){
System.out.println(name+":: 새 메시지가 없습니다.");
}또 다른
System.out.println(name+":: 메시지 소비 중::"+msg);
}
@보수
공공 무효 setSubject(주제 하위) {
this.topic=sub;
}
}
update() 메서드 구현에서는 관찰자의 getUpdate()를 사용하여 업데이트된 메시지를 처리합니다. 여기서는 메시지를 update() 메서드에 매개변수로 전달하는 것을 피해야 합니다.
다음은 토픽 클래스의 구현을 확인하는 간단한 테스트 프로그램입니다.
다음과 같이 코드 코드를 복사합니다.
패키지 com.journaldev.design.observer;
공개 클래스 ObserverPatternTest {
공개 정적 무효 메인(String[] args) {
//주제 생성
MyTopic 주제 = 새로운 MyTopic();
//관찰자 생성
관찰자 obj1 = new MyTopicSubscriber("Obj1");
관찰자 obj2 = new MyTopicSubscriber("Obj2");
관찰자 obj3 = new MyTopicSubscriber("Obj3");
//주제에 관찰자를 등록합니다.
topic.register(obj1);
topic.register(obj2);
topic.register(obj3);
//주제에 관찰자를 연결합니다.
obj1.setSubject(주제);
obj2.setSubject(주제);
obj3.setSubject(주제);
//사용 가능한 업데이트가 있는지 확인
obj1.update();
//이제 제목에 메시지를 보냅니다.
topic.postMessage("새 메시지");
}
}
위의 출력은 다음과 같습니다.
다음과 같이 코드 코드를 복사합니다.
Obj1:: 새 메시지 없음
주제:새 메시지에 게시된 메시지
Obj1::메시지 소비 중::새 메시지
Obj2::메시지 소비 중::새 메시지
Obj3::메시지 소비 중::새 메시지</pre>
관찰자 패턴의 UML 다이어그램
관찰자 패턴은 게시-구독 패턴이라고도 합니다. JAVA의 일부 특정 애플리케이션은 다음과 같습니다.
1.스윙의 java.util.EventListener
2.javax.servlet.http.HttpSessionBindingListener
3.javax.servlet.http.HttpSessionAttributeListener
위의 내용은 모두 관찰자 모드입니다. 당신이 이미 그것을 좋아하길 바랍니다. 댓글로 여러분의 감정을 공유하거나 다른 사람들과 공유해 주세요.