programing

Observerable과 Observable은 언제 사용해야 합니까?

projobs 2022. 8. 18. 23:11
반응형

Observerable과 Observable은 언제 사용해야 합니까?

면접관이 나에게 물었다.

죠?Observer ★★★★★★★★★★★★★★★★★」Observable그리고 우리는 그것들을 언제 사용해야 하나요?

는 이런잘 집에 요. 그래서 집에 돌아와서 구글을 검색하기 시작했을 때Observer ★★★★★★★★★★★★★★★★★」Observable여러 리소스에서 몇 가지 포인트를 찾았습니다.

1)은 클래스이며 인터페이스입니다.

더 2) »Observable는 클래스 합니다.Observers.

③ ③ 3 3 3 3 3 3 3 3Observable되면 "개체"가 됩니다.update() Observer이 변경되었음을 통지합니다.

다음 예를 찾았습니다.

import java.util.Observable;
import java.util.Observer;

class MessageBoard extends Observable
{
    public void changeMessage(String message) 
    {
        setChanged();
        notifyObservers(message);
    }
}

class Student implements Observer 
{
    @Override
    public void update(Observable o, Object arg) 
    {
        System.out.println("Message board changed: " + arg);
    }
}

public class MessageBoardTest 
{
    public static void main(String[] args) 
    {
        MessageBoard board = new MessageBoard();
        Student bob = new Student();
        Student joe = new Student();
        board.addObserver(bob);
        board.addObserver(joe);
        board.changeMessage("More Homework!");
    }
}

하지만 왜 우리가 이 일을 해야 하는지 이해가 안그래?Observer ★★★★★★★★★★★★★★★★★」Observable? 의 개요setChanged() ★★★★★★★★★★★★★★★★★」notifyObservers(message)떤방 ??

Student와 MessageBoard의 구체적인 예가 있습니다.학생은 새 메시지가 MessageBoard에 게시될 때 알림을 받을 관찰자 목록에 자신을 추가하여 등록합니다.메시지가 MessageBoard에 추가되면 해당 옵저버 목록에 반복되어 이벤트가 발생했음을 알립니다.

트위터를 생각해 보세요.팔로우 하고 싶다고 하면, 트위터는 팔로우 리스트에 당신을 추가합니다.그들이 새로운 트윗을 보냈을 때, 당신은 그것을 당신의 입력에서 볼 수 있습니다.이 경우, 당신의 트위터 계정은 옵저버이고, 당신이 팔로우하고 있는 사람은 옵저버블입니다.

트위터가 중재자가 될 가능성이 높기 때문에 이 비유는 완벽하지 않을 수 있다.하지만 그것은 요점을 설명한다.

간단히 말하면, (다른 답변은 어쨌든 모든 공식 설계 패턴을 참조하고 있기 때문에 자세한 내용은 해당 패턴을 참조해 주십시오.

프로그램 생태계의 다른 클래스에 의해 모니터링되는 클래스를 원하는 경우 클래스를 관찰할 수 있도록 해야 한다고 말합니다.즉, 프로그램의 나머지 부분에 브로드캐스트할 수 있는 상태가 변경될 수 있습니다.

그러기 위해서는 어떤 방법을 호출해야 합니다.관찰 가능한 클래스가 관찰에 관심이 있는 클래스와 긴밀하게 결합되는 것을 원하지 않습니다.특정 기준을 충족하기만 하면 누구든 상관없다.(라디오 방송국이라고 가정하면 FM 라디오가 주파수에 맞춰져 있으면 누가 듣든 상관없습니다.)그러기 위해서는 옵저버라고 불리는 인터페이스를 사용합니다.

따라서 Observable 클래스에는 Observer 목록이 있습니다(즉, Observer 인터페이스 메서드를 구현하는 인스턴스).방송하고 싶을 때마다 모든 관찰자에게 차례로 메서드를 호출합니다.

마지막으로 퍼즐을 닫는 것은 옵저버블 클래스가 누가 관심이 있는지 어떻게 알 수 있는가이다.관측할 수 있다음음음 as addObserver(Observer o)는 옵저버 목록에 옵저버를 내부적으로 추가하여 중요한 일이 발생했을 때 목록을 루프하고 목록 내의 각 인스턴스의 옵저버 인터페이스의 각 알림 방식을 호출합니다.

도 있어요.java.util.Observer ★★★★★★★★★★★★★★★★★」java.util.Observable이치노이 컨셉은 디자인 패턴입니다.Java는 필요할 때 신속하게 구현할 수 있도록 즉시 사용할 수 있도록 지원합니다.따라서 실제 메서드/클래스(필요할 때 검색할 수 있음)보다는 개념을 이해하는 것이 좋습니다.

갱신하다

코멘트에 응답하여 실제 클래스는 다음과 같은 기능을 제공합니다.

  1. 의 목록 java.util.Observer 이 있는 새로운 알림에 관심이 있는 경우를 통해 할 수 있습니다.addObserver(Observer o)를 통해 deleteObserver(Observer o).

  2. 내부 상태를 유지하여 관찰자에 대한 마지막 알림 이후 개체가 변경되었는지 여부를 지정합니다. '이렇게 하다'라고 하는 을 분리해서 쓸 수 요.Observable는 변경을 통지하는 부분부터 변경되었습니다.(예를 들어 여러 변경이 발생하여 각 작은 스텝이 아닌 프로세스 종료 시에만 통지하는 경우에 편리합니다). 하는 은 '어느끼다'를 .setChanged() 어떤 을 바꾸었을 때 Observable '나머지'도 싶다.Observers알게 된 것 같아요

  3. 에게 특정의 「」를 통지한다.Observable상태가 변경되었습니다. 하는 은 '어느끼다'를 .notifyObservers()은 「 「」의 「」의 「」, 「」의 「」의 콜setChanged()(어느 쪽인가 하면) 하다 버전이 , 다른 없는 버전입니다. 나나는른 른른른른Object인수(통지와 함께 추가 정보를 전달하려는 경우)를 지정합니다.으로 일어나는 이다.Observer인스턴스 및 각 인스턴스의 메서드를 호출합니다.이것은,Observer된 가능 이며, 추가(의 관찰 가능) 관찰 가능 오브젝트입니다.Object arg( 가지고 notifyObservers().

정의.

옵저버 패턴은 객체 간에 1대 다의 관계가 있는 경우(예를 들어 하나의 객체가 변경되었을 경우)에 해당 종속 객체에 자동으로 통지되고 모든 종속 객체에 대응하는 변경이 이루어집니다.

  1. 예를 들어, 당신의 본적지가 변경되었다고 가정하면, 당신은 여권 당국과 판카드 당국에 통보해야 합니다.그래서 여기 여권 당국과 팬카드 당국에서 옵저버이고 당신은 대상입니다.

  2. Facebook에서도 가입하면 새로운 업데이트가 있을 때마다 알림이 표시됩니다.

사용 시기:

  1. 한 개체의 상태가 변경되면 다른 모든 종속 개체는 일관성을 유지하기 위해 해당 상태를 자동으로 변경해야 합니다.

  2. 실험 대상자가 관찰자 수를 모를 때요

  3. 개체가 개체를 인식하지 않고 다른 개체에 알릴 수 있어야 하는 경우.

순서 1

Subject 클래스를 만듭니다.

Subject.java

  import java.util.ArrayList;
  import java.util.List;

  public class Subject {

  private List<Observer> observers 
        = new ArrayList<Observer>();
  private int state;

  public int getState() {
    return state;
  }

 public void setState(int state) {
   this.state = state;
   notifyAllObservers();
 }

   public void attach(Observer observer){
     observers.add(observer);       
   }

  public void notifyAllObservers(){
    for (Observer observer : observers) {
     observer.update();
  }
}   

}

순서 2

옵서버 클래스를 만듭니다.

Observer.java

public abstract class Observer {
   protected Subject subject;
   public abstract void update();
}

순서 3

구체적인 옵서버 클래스 만들기

BinaryObserver.java

public class BinaryObserver extends Observer{

  public BinaryObserver(Subject subject){
     this.subject = subject;
     this.subject.attach(this);
  }

  @Override
  public void update() {
     System.out.println( "Binary String: " 
     + Integer.toBinaryString( subject.getState() ) ); 
  }

}

OctalObserver.java

public class OctalObserver extends Observer{

   public OctalObserver(Subject subject){
     this.subject = subject;
    this.subject.attach(this);
 }

  @Override
  public void update() {
    System.out.println( "Octal String: " 
    + Integer.toOctalString( subject.getState() ) ); 
  }

}

HexaObserver.java

public class HexaObserver extends Observer{

  public HexaObserver(Subject subject){
    this.subject = subject;
    this.subject.attach(this);
 }

  @Override
  public void update() {
     System.out.println( "Hex String: " 
    + Integer.toHexString( subject.getState() ).toUpperCase() ); 
}

}

순서 4

Subject 및 구체적인 관찰자 객체를 사용합니다.

ObserverPatternDemo.java

 public class ObserverPatternDemo {
    public static void main(String[] args) {
       Subject subject = new Subject();

       new HexaObserver(subject);
       new OctalObserver(subject);
       new BinaryObserver(subject);

       System.out.println("First state change: 15");    
       subject.setState(15);
       System.out.println("Second state change: 10");   
       subject.setState(10);
 }

}

순서 5

출력을 확인합니다.

첫 번째 상태 변경: 15

16진수 문자열:f

8진수 문자열: 17

이진 문자열: 1111

두 번째 상태 변경: 10

16진수 문자열:a

8진수 문자열: 12

이진 문자열: 1010

이들은 옵저버 설계 패턴의 일부입니다.일반적으로 한 명 이상의 오버버에게 하나의 관측 가능한 변경에 대한 정보가 제공됩니다.'뭔가'가 발생했다는 알림입니다. 프로그래머로서 '뭔가'의 의미를 정의할 수 있습니다.

이 패턴을 사용하면 두 도면요소를 서로 분리할 수 있습니다. 그러면 관찰자가 플러그가 가능합니다.

Observer a.k.a 콜백은 Observable에 등록됩니다.

예를 들어 특정 시점에 발생한 이벤트에 대해 알리는 데 사용됩니다.Swing, Ajax, GWT 등에서의 디스패치 작업에 널리 사용됩니다.UI 이벤트(버튼 클릭, 텍스트 필드 변경 등)

Swing에는 add XXX Listener(Listener l) 등의 메서드가 있으며 GWT에는 (Async) 콜백이 있습니다.

옵서버의 리스트는 동적이기 때문에, 옵서버는 런타임중에 등록 및 등록 해제를 실시할 수 있습니다.또, 인터페이스가 사용되고 있기 때문에, 옵서버로부터 관측 가능한 것을 분리하는 것도 좋은 방법입니다.

인터뷰 진행자가 Observer 클래스 및 인터페이스를 사용하지 않고 Observer 설계 패턴을 구현하도록 요청하면 다음과 같은 간단한 예를 사용할 수 있습니다.

옵서버 인터페이스로서의 MyObserver

interface MyObserver {

    void update(MyObservable o, Object arg);
}

MyObservable을 Observable 클래스로 지정

class MyObservable
{
    ArrayList<MyObserver> myObserverList = new ArrayList<MyObserver>();

    boolean changeFlag = false;

    public void notifyObservers(Object o)
    {
        if (hasChanged())
        {
            for(MyObserver mo : myObserverList) {
                mo.update(this, o);
            }
            clearChanged();
        }
    }


    public void addObserver(MyObserver o) {
        myObserverList.add(o);        
    }

    public void setChanged() {
        changeFlag = true;
    }

    public boolean hasChanged() {
        return changeFlag;
    }

    protected void clearChanged() {
        changeFlag = false;
    }

    // ...
}

MyObserver 및 MyObservable을 사용한 예!

class MessageBoard extends MyObservable {
  private String message;

  public String getMessage() {
    return message;
  }

  public void changeMessage(String message) {
    this.message = message;
    setChanged();
    notifyObservers(message);
  }

  public static void main(String[] args) {
    MessageBoard board = new MessageBoard();
    Student bob = new Student();
    Student joe = new Student();
    board.addObserver(bob);
    board.addObserver(joe);
    board.changeMessage("More Homework!");
  }
}

class Student implements MyObserver {

  @Override
  public void update(MyObservable o, Object arg) {
    System.out.println("Message board changed: " + arg);
  }

}

"정확히 왜 옵저버와 옵저버블이 필요한지 알아보려고 했습니다."

앞서 설명한 바와 같이 관찰 가능한 자동 알림을 수신하도록 관찰자를 등록하는 수단을 제공합니다.

이것이 유용한 응용 프로그램 중 하나가 데이터 바인딩입니다. 예를 들어 일부 데이터를 편집하는 UI가 있고 데이터가 업데이트될 때 UI가 반응하도록 하려면 데이터를 관찰할 수 있도록 하고 UI 구성 요소를 데이터에 등록할 수 있습니다.

Knocko.js는 훌륭한 입문 튜토리얼을 갖춘 MVVM javascript 프레임워크입니다.더 많은 관찰 가능한 정보를 보려면 튜토리얼을 참조하는 것을 추천합니다.http://learn.knockoutjs.com/

기사는 Visual Studio 2008 시작 페이지(Overserver Pattern은 모델 뷰 컨트롤러(MVC) 개발의 기반)에서도 발견되었습니다.http://visualstudiomagazine.com/articles/2013/08/14/the-observer-pattern-in-net.aspx

옵저버 패턴에 대한 간단한 설명을 http://www.devcodenote.com/2015/04/design-patterns-observer-pattern.html에 작성했습니다.

투고 내용:

옵저버 패턴 : 기본적으로 오브젝트 간에 일대다 관계를 확립하고 상호의존적인 오브젝트 간에 느슨하게 결합된 설계를 가지고 있습니다.

교과서 정의:Observer Pattern은 개체 간의 일대다 종속성을 정의하여 한 개체의 상태가 변경되면 모든 종속 요소에 자동으로 알림과 업데이트가 이루어집니다.

예를 들어 피드 알림 서비스를 생각해 보십시오.서브스크립션 모델은 옵서버 패턴을 이해하는 데 가장 적합합니다.

옵저버 패턴은 오브젝트 간에 1대 다의 관계가 있는 경우(예를 들어 오브젝트가 변경되었을 경우)에 의존한 오브젝트에 자동으로 통지됩니다.

Java9 이후 두 인터페이스는 더 이상 사용하지 않습니다.'옵저버' Java 9에서 더 이상 사용되지 않습니다. 그 대신 뭘 쓸까요?

하지만 인터뷰에 대한 질문은 계속 받을 수 있습니다.

언급URL : https://stackoverflow.com/questions/13744450/when-should-we-use-observer-and-observable

반응형