软件设计模式——观察者模式(Observer)

介绍

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

应用实例

1、拍卖的时候,拍卖师观察最高标价,然后通知给其他竞价者竞价。
2、西游记里面悟空请求菩萨降服红孩儿,菩萨洒了一地水招来一个老乌龟,这个乌龟就是观察者,他观察菩萨洒水这个动作。

实现

观察者模式使用三个类 Subject、Observer 和 Client。
Subject 对象带有绑定观察者到 Client 对象和从 Client 对象解绑观察者的方法。我们创建 Subject 类、Observer 抽象类和扩展了抽象类 Observer 的实体类。
软件设计模式——观察者模式(Observer)_第1张图片

//创建 Subject 类。
public class Subject {
    private Listobservers = new ArrayList();
    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();
        }
    }
}
//创建 Observer 类。
public abstract class Observer {
    protected Subject subject;
    public abstract void update();
}
//创建实体观察者类。
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()));
    }
}
//创建实体观察者类。
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()));
    }
}
//创建实体观察者类。
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());
    }
}
//使用 Subject 和实体观察者对象。
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);
    }
}

输出结果:
First state change:15
Hex String:F
Octal String:17
Binary String:1111
Second state change:10
Hex String:A
Octal String:12
Binary String:1010

你可能感兴趣的:(软件设计模式)