JAVA에서 관찰자 패턴을 구현하는 방법
개념
publish-subscribe 패턴이라고도 하는 관찰자 패턴은 개체 간의 일대다 관계입니다. 개체의 상태가 변경되면 해당 개체에 종속된 모든 개체가 알림을 받고 자동으로 업데이트됩니다.
Composition
추상 테마 역할(Subject
Subject
)
也叫抽象目标类,抽象主题知道自己的观察者有哪些,提供删除和新增观察者的方法以及通知观察者的抽象方法,由抽象类或接口实现
抽象观察者角色(Observer
)
包含了一个更新的抽象方法,当收到具体主题的更新通知后调用,由抽象类或接口实现
具体主题角色(Concrete Subject
)
也叫具体目标类,实现抽象目标类的通知方法,当具体主题发生改变时通知所有订阅自己的观察者
具体观察者角色(Concrete Observer
)
实现抽象观察者角色的抽象方法,收到主题更改通知后更改自身状态
实现
抽象观察者Observer
接口
包含一个观察者接收通知改变自身状态方法
public interface Observer { //收到通知,改变自身状态 void update(); }
具体观察者ObserverOne
和ObserverTwo
实现Observer接口中的update方法
public class ObserverOne implements Observer{ @Override public void update() { System.out.println("第一个观察者收到通知,状态更新了"); } }
public class ObserverTwo implements Observer { @Override public void update() { System.out.println("第二个观察者收到通知,状态更新了"); } }
Subject
接口
包含添加,删除,通知观察者方法,由抽象目标类实现,还有一个自身操作的方法,由具体目标类实现
public interface Subject { //添加观察者 void add(Observer observer); //删除观察者 void remove(Observer observer); //通知所有观察者 void notifyObservers(); //自身操作 void operation(); }
抽象目标类AbstractSubject
抽象类,因为观察者数量不固定,所以使用Vector动态数组存储观察者,实现Subject接口中的add,remove,notifyObservers方法,operation方法由具体目标类实现
public abstract class AbstractSubject implements Subject{ Vector<Observer> vector = new Vector<Observer>(); @Override public void add(Observer observer){ vector.add(observer); } @Override public void remove(Observer observer){ vector.remove(observer); } @Override public void notifyObservers(){ for (Observer observer : vector) { observer.update(); } } }
具体目标类MySubject
继承AbstractSubject类,实现operation方法,并在operation方法中调用notifyObservers方法以达到自身状态改变后通知观察者的效果
public class MySubject extends AbstractSubject{ @Override public void operation() { System.out.println("具体目标状态改变"); System.out.println("正在通知观察者。。。"); notifyObservers(); System.out.println("通知完毕!"); } }
测试类Test
)
추상 타겟 클래스라고도 하며, 추상 테마는 어떤 관찰자가 있는지 알고 관찰자를 삭제하고 추가하는
추상 관찰자 역할(Observer
에는 수신 시 업데이트된 추상 메서드가 포함됩니다. 업데이트 후 호출됩니다. 추상 클래스 또는 인터페이스에 의해 구현된 특정 주제 알림
구체적인 주제 역할(Concrete Subject
)
특정 대상 클래스라고도 하며 추상의 알림 방법을 구현합니다. 대상 클래스,
특정 주제가 변경될 때구체적인 관찰자 역할(
- ) 추상 관찰자 역할을 구현하는 추상 메소드,
- 수신 테마 변경 알림 후 자체 상태 변경
implementation
Concrete Observer

Observer
interface
- 에는 알림을 받고 상태
- 특정 관찰자
public class Test { public static void main(String[] args) { MySubject mySubject = new MySubject(); mySubject.add(new ObserverOne()); mySubject.add(new ObserverTwo()); mySubject.operation(); } }
로그인 후 복사ObserverOne
- 및
ObserverTwo를 변경하는 관찰자 메서드가 포함되어 있습니다. code >
Observer 인터페이스에서 업데이트 메소드 구현 - rrreeerrreee
InterfaceSubject
🎜에는 관찰자 추가, 삭제, 알림을 위한 메소드가 포함되어 있으며 추상 대상 클래스에 의해 구현됩니다. 자체 연산, 특정 대상 클래스🎜rrreee🎜🎜Abstract 대상 클래스🎜
AbstractSubject
🎜🎜Abstract 클래스, 관찰자의 수가 고정되어 있지 않으므로 🎜Vector 동적 배열🎜을 사용하여 관찰자를 저장합니다. Subject 인터페이스에 추가, 제거, 통지Observers 메소드를 구현하고 🎜작업 메소드는 특정 대상 클래스에 의해 구현됩니다. 🎜🎜rrreee🎜🎜특정 대상 클래스 🎜MySubject
🎜🎜AbstractSubject 클래스를 상속하고 작업을 구현합니다. 🎜작업 메서드에서 informObservers 메서드를 호출합니다. 🎜관찰자 상태 변경 후 관찰자에게 알리는 효과를 얻으려면🎜rrreee🎜🎜Test class🎜Test
🎜rrreee🎜🎜🎜🎜요약 🎜🎜🎜 관찰자 모드는 주로 어떤 문제를 해결하는가🎜🎜🎜낮은 결합 조건에서 객체의 상태가 변경되면 다른 객체가 알림을 받게 됩니다🎜🎜🎜관찰자 패턴을 사용해야 하는 경우🎜🎜🎜객체의 상태가 바뀔 때 변경 사항이 있으면 모든 종속 객체가 브로드캐스트 알림을 받습니다🎜🎜🎜Observer 패턴의 장점🎜🎜🎜Observer와 대상이 추상적으로 결합되어 있고 낮은 결합도 및 일련의 트리거 메커니즘이 있습니다🎜🎜🎜Observer 패턴의 단점🎜🎜🎜🎜 🎜①타겟이 직접 관찰자와 간접 관찰자에 의존하는 경우 많으면 모든 관찰자에게 알리는 데 많은 시간이 걸립니다🎜🎜🎜🎜② 관찰자와 관찰자 사이에 순환 종속성이 있으면 순환 호출이 발생할 수 있습니다. system to crash🎜🎜🎜🎜 ③관찰자는 대상을 알 수 없다. 상태가 어떻게 변하는지, 대상의 상태가 바뀌었다는 것만 알 수 있다🎜🎜🎜🎜🎜관찰자 패턴에 대한 주의사항🎜🎜🎜🎜🎜 ①에 대한 지원 클래스가 이미 있습니다. JAVA에서는 옵저버 패턴을 직접 사용할 수 있습니다🎜🎜🎜🎜② 순환 호출 방지 🎜🎜🎜🎜3 옵저버의 업데이트 메소드를 순차적으로 실행하면 옵저버 오류로 인해 시스템이 중단됩니다. 일반적으로 비동기 방식입니다. 사용. 🎜🎜🎜위 내용은 JAVA에서 관찰자 패턴을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제









Java의 난수 생성기 안내. 여기서는 예제를 통해 Java의 함수와 예제를 통해 두 가지 다른 생성기에 대해 설명합니다.

자바의 암스트롱 번호 안내 여기에서는 일부 코드와 함께 Java의 Armstrong 번호에 대한 소개를 논의합니다.

Java의 Weka 가이드. 여기에서는 소개, weka java 사용 방법, 플랫폼 유형 및 장점을 예제와 함께 설명합니다.

Java의 Smith Number 가이드. 여기서는 정의, Java에서 스미스 번호를 확인하는 방법에 대해 논의합니다. 코드 구현의 예.

이 기사에서는 가장 많이 묻는 Java Spring 면접 질문과 자세한 답변을 보관했습니다. 그래야 면접에 합격할 수 있습니다.

Java 8은 스트림 API를 소개하여 데이터 컬렉션을 처리하는 강력하고 표현적인 방법을 제공합니다. 그러나 스트림을 사용할 때 일반적인 질문은 다음과 같은 것입니다. 기존 루프는 조기 중단 또는 반환을 허용하지만 스트림의 Foreach 메소드는이 방법을 직접 지원하지 않습니다. 이 기사는 이유를 설명하고 스트림 처리 시스템에서 조기 종료를 구현하기위한 대체 방법을 탐색합니다. 추가 읽기 : Java Stream API 개선 스트림 foreach를 이해하십시오 Foreach 메소드는 스트림의 각 요소에서 하나의 작업을 수행하는 터미널 작동입니다. 디자인 의도입니다
