>  기사  >  Java  >  Java 디자인 패턴의 관찰자 패턴에 대한 구체적인 분석

Java 디자인 패턴의 관찰자 패턴에 대한 구체적인 분석

黄舟
黄舟원래의
2017-08-10 09:32:041303검색

이 글에서는 각 객체가 상태를 변경할 때 객체 간의 일대다 종속 관계를 정의하는 트래픽 Java 디자인 패턴의 관찰자 패턴을 소개합니다. 다음은 클래스 다이어그램과 예제 코드를 통해 Java 디자인 패턴의 관찰자 패턴을 소개합니다. 관심 있는 친구들은 함께 살펴보세요

정의: 객체 간의 일대다 종속 관계를 정의하여 각 객체가 상태가 변경되면 이에 의존하는 모든 객체가 자동으로 통보되고 업데이트됩니다.

유형: 행동 패턴

클래스 다이어그램:

소프트웨어 시스템에는 종종 다음과 같은 요구 사항이 있습니다. 객체의 상태가 변경되면 이와 관련된 일부 객체도 이에 따라 변경에 응답해야 합니다. 예를 들어, 소프트웨어의 유효한 영역 내에서 마우스 오른쪽 버튼을 클릭하면 메뉴가 팝업되는 기능을 디자인하고 싶습니다. 자동 배포를 디자인하고 싶습니다. 기능은 eclipse를 개발할 때와 마찬가지로 파일이 수정되는 한 eclipse는 수정된 파일을 자동으로 서버에 배포합니다. 이 두 기능은 유사합니다. 즉, 한 개체는 항상 다른 개체를 모니터링해야 하며 상태가 변경되자마자 해당 작업을 수행해야 합니다. 실제로 이를 달성할 수 있는 솔루션은 많지만 관찰자 모드를 사용하는 것이 주류 선택이라는 점에는 의심의 여지가 없습니다.

옵저버 패턴의 구조

가장 기본적인 옵저버 패턴에는 다음과 같은 4가지 역할이 포함됩니다.

  •  옵저버: 클래스 다이어그램에서 볼 수 있듯이 사용자가 있습니다. 클래스 Vector 컨테이너는 관찰자 개체를 저장합니다(List 대신 Vector가 사용되는 이유는 Vector는 다중 스레드 작업 중에 안전하지만 List는 안전하지 않기 때문입니다). 이 Vector 컨테이너는 관찰자 클래스의 핵심입니다. 메소드: 부착 메소드는 이 컨테이너에 관찰자 객체를 추가하는 것이고, 분리 메소드는 관찰자 객체를 컨테이너에서 제거하는 것입니다. 통지 메소드는 관찰자 객체의 해당 메소드를 순서대로 호출하는 것입니다. 이 역할은 인터페이스, 추상 클래스 또는 구체적인 클래스일 수 있습니다. 다른 패턴과 혼합되는 경우가 많기 때문에 추상 클래스가 사용되는 경우가 많습니다.

  •  관찰자 역할은 일반적으로 하나의 업데이트 메서드만 갖습니다. 이 메서드는 관찰자의 상태가 변경될 때 트리거되고 호출됩니다.

  •  Specific Observable: 이 역할은 확장을 촉진하는 데 사용되며 이 역할에서 특정 비즈니스 로직을 정의할 수 있습니다.

  •  특정 관찰자: 관찰자 인터페이스의 특정 구현입니다. 이 역할에서는 관찰된 객체의 상태가 변경될 때 처리할 논리를 정의합니다.

관찰자 패턴 코드 구현


abstract class Subject { 
  private Vector<Observer> obs = new Vector<Observer>(); 
  public void addObserver(Observer obs){ 
    this.obs.add(obs); 
  } 
  public void delObserver(Observer obs){ 
    this.obs.remove(obs); 
  } 
  protected void notifyObserver(){ 
    for(Observer o: obs){ 
      o.update(); 
    } 
  } 
  public abstract void doSomething(); 
} 
class ConcreteSubject extends Subject { 
  public void doSomething(){ 
    System.out.println("被观察者事件反生"); 
    this.notifyObserver(); 
  } 
} 
interface Observer { 
  public void update(); 
} 
class ConcreteObserver1 implements Observer { 
  public void update() { 
    System.out.println("观察者1收到信息,并进行处理。"); 
  } 
} 
class ConcreteObserver2 implements Observer { 
  public void update() { 
    System.out.println("观察者2收到信息,并进行处理。"); 
  } 
} 
public class Client { 
  public static void main(String[] args){ 
    Subject sub = new ConcreteSubject(); 
    sub.addObserver(new ConcreteObserver1()); //添加观察者1 
    sub.addObserver(new ConcreteObserver2()); //添加观察者2 
    sub.doSomething(); 
  } 
}

실행 결과

관찰된 이벤트가 반영됩니다

관찰자 1이 정보를 받아 처리합니다.

관찰자 2는 정보를 수신하고 처리합니다.

실행 결과를 보면 Subject 메서드만 호출했는데 동시에 두 Observer의 관련 메서드도 동시에 호출된 것을 알 수 있습니다. 코드를 자세히 살펴보세요. 실제로는 매우 간단합니다. Observer 클래스를 Subject 클래스에 연결하고 doSomething 메서드에서 Observer의 업데이트 메서드를 순회하는 것뿐입니다. ㅋㅋㅋ                                                                                 관찰되고 있는 물체가 있었나요

? 관찰자 모드는 일반적으로 사용되는 트리거 메커니즘으로 트리거 체인을 형성하고 각 관찰자의 메서드를 차례로 처리합니다. 하지만 동시에 이는 옵저버 모드의 단점이기도 합니다. 체인 트리거이기 때문에 옵저버가 많을 경우 성능 문제가 더욱 걱정됩니다. 게다가 체인 구조에서는 순환 참조 오류가 발생하기 쉬워 시스템이 정지됩니다.


Summary


Java 언어에는 Observer 인터페이스와 관찰자 역할을 구현하는 Observable 구현 클래스가 있습니다. jdk api 문서에서 이 두 클래스의 사용법을 확인할 수 있습니다. VC++, JavaScript DOM 또는 AWT 개발을 해본 친구들은 모두 이벤트 처리에 놀랐습니다. 관찰자 패턴을 이해하고 나면 이벤트 처리 메커니즘의 원리를 어느 정도 이해하게 될 것입니다. 이벤트 트리거링 처리 메커니즘의 기능을 설계하려면 관찰자 패턴을 사용하는 것이 좋습니다. AWT의 이벤트 처리 DEM(Delegation Event Model)은 관찰자 패턴을 사용하여 구현됩니다.

위 내용은 Java 디자인 패턴의 관찰자 패턴에 대한 구체적인 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.