Skip to main content
 首页 » 编程设计

Java 观察者模式

2022年07月19日45zhwl

1.观察者模式简介

当对象间存在一对多关系时,则可使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者
模式属于行为型模式。

使用场景:
一个抽象模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立地改变和复用。
一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。
一个对象必须通知其他对象,而并不知道这些对象是谁。

关键代码:在抽象类里有一个 ArrayList 存放观察者们。

注意:目前java中已经有对观察者进行支持的类。


2.实现Demo

观察者模式使用三个类 Subject、Observer 和 Client(ObserverPatternDemo)。Subject 对象带有绑定观察者到 Client 对象和从 Client 对象解绑观察者的方法。
我们创建 Subject 类、Observer 抽象类和扩展了抽象类 Observer 的实体类。

import java.util.List; 
import java.util.ArrayList; 
 
class Subject { 
    private int state; 
    private List<Observer> lists = new ArrayList<Observer>(); 
 
    public int getState() { 
        return state; 
    } 
 
    public void setState(int state) { 
        this.state = state; 
        notifyAllObservers(); 
    } 
 
    public void attach(Observer observer) { 
        lists.add(observer); 
    } 
 
    public void notifyAllObservers() { 
        for (Observer observer : lists) { 
            observer.update(); 
        } 
    } 
} 
 
 
abstract class Observer { 
    protected Subject subject; 
    abstract public void update(); 
} 
 
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())); 
    } 
} 
 
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())); 
    } 
} 
 
class HexObserver extends Observer { 
    public HexObserver(Subject subject) { 
        this.subject = subject; 
        this.subject.attach(this); 
    } 
 
    @Override 
    public void update() { 
        System.out.println("Hexa String: " + Integer.toHexString(subject.getState()).toUpperCase()); 
    } 
} 
 
 
 
public class ObserverPatternDemo { 
    public static void main(String args[]) { 
        Subject subject = new Subject(); 
 
        Observer binaryObserver = new BinaryObserver(subject); 
        Observer octalObserver = new OctalObserver(subject); 
        Observer hexObserver = new HexObserver(subject); 
 
        subject.setState(10); 
 
        subject.setState(20); 
    } 
}

参考:http://www.runoob.com/design-pattern/observer-pattern.html


本文参考链接:https://www.cnblogs.com/hellokitty2/p/10732416.html