publish-subscribe 패턴이라고도 하는 관찰자 패턴은 개체 간의 일대다 관계입니다. 개체의 상태가 변경되면 해당 개체에 종속된 모든 개체가 알림을 받고 자동으로 업데이트됩니다.
추상 테마 역할(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
)
특정 대상 클래스라고도 하며 추상의 알림 방법을 구현합니다. 대상 클래스,
특정 주제가 변경될 때구체적인 관찰자 역할(
Concrete Observer
implementation
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 >
Subject
AbstractSubject
🎜🎜Abstract 클래스, 관찰자의 수가 고정되어 있지 않으므로 🎜Vector 동적 배열🎜을 사용하여 관찰자를 저장합니다. Subject 인터페이스에 추가, 제거, 통지Observers 메소드를 구현하고 🎜작업 메소드는 특정 대상 클래스에 의해 구현됩니다. 🎜🎜rrreee🎜🎜특정 대상 클래스 🎜MySubject
🎜🎜AbstractSubject 클래스를 상속하고 작업을 구현합니다. 🎜작업 메서드에서 informObservers 메서드를 호출합니다. 🎜관찰자 상태 변경 후 관찰자에게 알리는 효과를 얻으려면🎜rrreee🎜🎜Test class🎜Test
🎜rrreee🎜🎜🎜🎜요약 🎜🎜🎜 관찰자 모드는 주로 어떤 문제를 해결하는가🎜🎜🎜낮은 결합 조건에서 객체의 상태가 변경되면 다른 객체가 알림을 받게 됩니다🎜🎜🎜관찰자 패턴을 사용해야 하는 경우🎜🎜🎜객체의 상태가 바뀔 때 변경 사항이 있으면 모든 종속 객체가 브로드캐스트 알림을 받습니다🎜🎜🎜Observer 패턴의 장점🎜🎜🎜Observer와 대상이 추상적으로 결합되어 있고 낮은 결합도 및 일련의 트리거 메커니즘이 있습니다🎜🎜🎜Observer 패턴의 단점🎜🎜🎜🎜 🎜①타겟이 직접 관찰자와 간접 관찰자에 의존하는 경우 많으면 모든 관찰자에게 알리는 데 많은 시간이 걸립니다🎜🎜🎜🎜② 관찰자와 관찰자 사이에 순환 종속성이 있으면 순환 호출이 발생할 수 있습니다. system to crash🎜🎜🎜🎜 ③관찰자는 대상을 알 수 없다. 상태가 어떻게 변하는지, 대상의 상태가 바뀌었다는 것만 알 수 있다🎜🎜🎜🎜🎜관찰자 패턴에 대한 주의사항🎜🎜🎜🎜🎜 ①에 대한 지원 클래스가 이미 있습니다. JAVA에서는 옵저버 패턴을 직접 사용할 수 있습니다🎜🎜🎜🎜② 순환 호출 방지 🎜🎜🎜🎜3 옵저버의 업데이트 메소드를 순차적으로 실행하면 옵저버 오류로 인해 시스템이 중단됩니다. 일반적으로 비동기 방식입니다. 사용. 🎜🎜🎜위 내용은 JAVA에서 관찰자 패턴을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!