设计模式之观察者模式

发布于:2024-04-08 ⋅ 阅读:(93) ⋅ 点赞:(0)

观察者模式的感觉就是设计一个主题,主题中的数据发生变化会通知所有观察者数据发生变化了,然后每个观察者根据变化的数据改变自我的展示情况。举个例子,就比如我们看电影,当电影的内容改变的时候,我们每个人的脑海里呈现的信息就会发生改变。

借用一下菜鸟教程的类图

一个主题有观察者列表,state两个成员变量。以及get、set方法,attach增加观察者方法,notifyall通知所有观察者方法。每个观察者继承Observer抽象类,观察者内心都有一个主题subject,因为他们要观察的就是这个主题,以及每个人自己的update方法,因为信息在每个人心中的展示可能不一样。

在这里插入图片描述
talk is cheep, show me the code.
在这里插入图片描述
Subject.java

package ObserverPattern;

import java.util.ArrayList;
import java.util.List;

public class Subject {
    //观察者列表
    private List<Observer> observers = new ArrayList<Observer>();


    //所有观察者观察的target
    private int state;

    public int getState(){
        return state;
    }

    public void setState(int state){
        this.state = state;
        notifyAllObervers();
    }

    //给主题添加观察者
    public void attach(Observer observer){
        observers.add(observer);
    }

    //通知所有观察者他们观察的target变了,让每个观察者更新自己的展示数据
    public void notifyAllObervers(){
        for (Observer observer : observers){
            observer.update();
        }
    }


}

Observer.java

package ObserverPattern;

public abstract class Observer {
    protected Subject subject;
    public abstract void update();
}

OctalObserver.java

package ObserverPattern;

public class OctalObserver extends Observer{
    public OctalObserver(Subject subject){
        this.subject = subject;
        this.subject.attach(this);
    }

    @Override
    public void update(){
        System.out.println("Hex String: "
        + Integer.toHexString(subject.getState()));
    }

}

BinaryObserver.java

package ObserverPattern;

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()));
    }

}

HexaObserver.java

package ObserverPattern;

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()));
    }

}

main.java

//观察者模式
        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);

网站公告

今日签到

点亮在社区的每一天
去签到