[Design Pattern] Observer Pattern 简单案例

Observer Pattern,即观察者模式,当存在一对多关系,例如一个对象一有变动,就要自动通知被依赖的全部对象得场景,属于行为类的设计模式。

下面是一个观察者模式的简单案例。

Observer 定义观察者的接口,定义需要观察的对象,已经被通知的接口。BinaryObserver, OctalObserver, HexaObserver 各自实现了 Observer 接口。

Subject 是被观察的对象,记录了观察该对象的观察者列表,自身有变动,即可通知观察者列表中的各个观察者。

代码实现

Observer 接口,定义了被通知的方法,定义了观察的对象。

public abstract class Observer {

    protected Subject subject;
    
    public abstract void update(int value);
}

BinaryObserver, OctalObserver, HexaObserver 实现了 Observer 接口,实现了具体的被通知方法。

public class BinaryObserver extends Observer {

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

    @Override
    public void update(int value) {
        System.out.println("BinaryObserver " + Integer.toString(value, 2));
    }    
}
public class OctalObserver extends Observer {

    public OctalObserver(Subject subject){
        this.subject = subject;
        subject.attach(this);
    }
    
    @Override
    public void update(int value) {
        System.out.println("octal Observer update " + Integer.toString(value, 8));
    }
}
public class HexaObserver extends Observer {

    public HexaObserver(Subject subject){
        this.subject = subject;
        subject.attach(this);
    }
    
    @Override
    public void update(int value) {
        System.out.println("hexa Observer update " + Integer.toString(value, 16));
    }
}

Subject 是被观察的对象,内含一个观察本对象的观察者名单

public class Subject {
    
    private List<Observer> observers = new LinkedList<>();
    
    private int state;

    public int getState() {
        return state;
    }

    public void setState(int state) {
        this.state = state;
        this.notifyAllObservers();
    }
    
    public void attach(Observer observer){
        observers.add(observer);
    }
    
    public void notifyAllObservers(){
        for (Observer observer : observers){
            observer.update(state);
        }
    }
}

演示代码,每次更新 Subject 对象的属性,Subject 都会通知到观察它的观察者

public class ObserverPatternDemo {

    public static void main(){
        
        Subject subject = new Subject();
        
        new BinaryObserver(subject);
        new OctalObserver(subject);
        new HexaObserver(subject);

        subject.setState(17);
        subject.setState(9);    
    }
}

参考资料

Design Patterns - Observer Pattern, TutorlsPoint

原文地址:https://www.cnblogs.com/TonyYPZhang/p/5515938.html