观察者模式的定义是“定义一种一对多的依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会被自动通知并更新”。

观察者模式也被称为依赖(Dependents)发布-订阅(Publish-Subscribe)模式。

优点:

  • 它描述了对象和观察者之间的耦合关系。
  • 它提供了广播类型的通信支持。

使用场景:

  • 当一个对象的状态变化必须反映在另一个对象中,而不需要让对象之间紧密耦合时。
  • 当我们编写的框架需要在将来通过添加新的观察者来增强时,并且希望进行最小的更改。

观察者模式的UML:

7-1.png

观察者模式的实现

步骤 1:

创建一个实现java.util.Observer接口的ResponseHandler1类。

// 这是一个类
import java.util.Observable; 
import java.util.Observer; 

public class ResponseHandler1 implements Observer { 
    private String resp; 
    
    @Override
    public void update(Observable obj, Object arg) { 
        if (arg instanceof String) { 
            resp = (String) arg; 
            System.out.println("\nReceived Response: " + resp ); 
        } 
    } 
}

步骤 2:

创建一个实现java.util.Observer接口的ResponseHandler2类。

// 这是一个类
import java.util.Observable; 
import java.util.Observer; 

public class ResponseHandler2 implements Observer { 
    private String resp; 
    
    @Override
    public void update(Observable obj, Object arg) { 
        if (arg instanceof String) { 
            resp = (String) arg; 
            System.out.println("\nReceived Response: " + resp ); 
        } 
    } 
}

步骤 3:

创建一个继承java.util.Observable类的EventSource类。

// 这是一个类
import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.util.Observable; 

public class EventSource extends Observable implements Runnable { 
    @Override 
    public void run() { 
        try { 
            final InputStreamReader isr = new InputStreamReader(System.in); 
            final BufferedReader br = new BufferedReader(isr); 
            while (true) { 
                String response = br.readLine(); 
                setChanged(); 
                notifyObservers(response); 
            } 
        } 
        catch (IOException e) { 
            e.printStackTrace(); 
        } 
    } 
}

步骤 4:

创建一个ObserverPatternDemo类来展示观察者模式的使用。

// 这是一个类
public class ObserverPatternDemo { 
    public static void main(String[] args) { 
        EventSource eventSource = new EventSource(); 

        ResponseHandler1 handler1 = new ResponseHandler1(); 
        ResponseHandler2 handler2 = new ResponseHandler2(); 

        eventSource.addObserver(handler1); 
        eventSource.addObserver(handler2); 

        Thread thread = new Thread(eventSource); 
        thread.start(); 
    } 
}

输出:

当在控制台输入文本时,将会显示如下输出:

Received Response: <您输入的文本>

每次输入新的文本,所有的观察者(ResponseHandler1ResponseHandler2)都会收到更新的响应并输出相应的信息。

标签: Design Patterns, Design Patterns教程, 设计模式, 软件设计, 结构型模式, 行为型模式, 单例模式, 工厂模式, 观察者模式, 中介者模式, 访问者模式