1.17(设计模式)观察者模式

观察者模式定义了对象间一对多的关系,当一个对象状态发生变化时,所有依赖于该对象的对象也将发生变化。

例如需要显示一个数字(Subject)的十进制(Observer )和二进制(Observer ),当这个数发生变化时,对应显示的十进制和二进制数也要发生变化。

这就可以使用观察者模式,显示十进制数和二进制数依赖于具体的数字,当具体数字发生变化时,依赖对象也发生变化。

Subject

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;
        notifyAllObserver();//更新具体数字时同时通知Observer更新状态
    }
    
    public void attach(Observer observer) {//添加依赖对象(二、十进制显示)
        this.observers.add(observer);
    }
    
    public void notifyAllObserver() {//通知所有Observer更新
        for(Observer observer : observers) {
            observer.update();
        }
    }
}

Observer

Observer是依赖于Subject的对象,当Subject发生变化时,依赖的Observer也发生变化。

public abstract class Observer {
    protected Subject subject;//Observer依赖的对象
    public abstract void update();//Observer更新
}

二进制显示(Observer)

public class BinaryObserver extends Observer{
    
    public BinaryObserver(Subject subject) {//绑定subject,当subject发生变化时,该对象也发生变化。
        this.subject = subject;
        this.subject.attach(this);//将当前对象(Observer)添加到subject中的observers 
 } 

@Override
public void update() { //subject发生变化,调用notifyAllObsever时更新显示数据
  System.out.println(
"BinaryObserver:" + Integer.toBinaryString(subject.getState()));
  }
}

十进制显示(Observer)

public class OctalObserver extends Observer{
    
    
    
    public OctalObserver(Subject subject) {//绑定subject,当subject发生变化时,该对象也发生变化。
        this.subject = subject;
        this.subject.attach(this);//将当前对象(Observer)添加到subject中的observers 
    }

    @Override
    public void update() {//subject发生变化,调用notifyAllObsever时更新显示数据
        System.out.println("OctalObserver:" + subject.getState());
    }

}

Main

public class Main {
    public static void main(String[] args) {
        //创建subject,Observer依赖于subject,subject发生变化时,observer同时发生变化
        Subject subject = new Subject();
        //将object与subject绑定
        new BinaryObserver(subject);
        new OctalObserver(subject);
        //subject发生变化时,object同时发生变化
        subject.setState(10);
        subject.setState(20);
    }
}
运行结果:
BinaryObserver:1010 OctalObserver:10 BinaryObserver:10100 OctalObserver:20

参考资料:

https://www.runoob.com/design-pattern/observer-pattern.html

原文地址:https://www.cnblogs.com/huang-changfan/p/11045140.html