观察者模式

观察者模式是行为型模式的一种,它是 对象之间多对一的一种设计方案,就是多个观察者盯着一个主对象,若主对象发生某种行为,就可以通知观察者做出相应反应。

假设需求:

现有一个校讯通系统,该系统内可以绑定多个电话号码,当校讯通更改通知消息的同时,自动短信通知多个电话号码。

UML类图:

角色分析:

Subject:抽象被观察者,具体实现者使用一个容器保存观察者,实现该接口具有添加、删除、通知观察者功能。

Observe:抽象观察者,实现该接口具有更新自身状态的功能。

具体代码:

Subject:

public interface Subject {
    //添加观察者
    void registerObserver(Observerr o);
    //删除观察者
    void remove(Observerr o);
    //通知所有观察者
    void notifyObservers();
}

SchoolChatSys:

public class SchoolChatSys implements Subject{
    //装载观察者容器
    private List<Observerr> observsers ;
    //系统通知信息
    private String msg;

    public SchoolChatSys() {
        this.observsers = new ArrayList<>();
    }
    //系统通知信息改变,通知所有观察者
    public void setMsg(String msg) {
        this.msg = msg;
        dataChange();
    }
    private void dataChange() {
        notifyObservers();
    }

    //注册
    public void registerObserver(Observerr o) {
        observsers.add(o);
    }
    //移除
    public void remove(Observerr o) {
        if(observsers.contains(o)){
            observsers.remove(o);
        }
    }
    //通知
    public void notifyObservers() {
        for(int i = 0; i<observsers.size(); i++){
            Observerr observerr = observsers.get(i);
            observerr.update(msg);
        }
    }
}

Observerr:

public interface Observerr {
    //更新自身状态
    void update(String msg);
}

Num:

public class Num implements Observerr{
    //电话号码
    private String num;
    public Num(String num) {
        this.num = num;
    }

    @Override
    public void update(String msg) {
        System.out.println("用户号码"+num+"已获取信息:"+msg);
    }
}

Client(测试类):

public class Client {
    public static void main(String[] args) {
        //被观察者
        SchoolChatSys school = new SchoolChatSys();

        //观察者
        Observerr numA = new Num("12345678");
        Observerr numB = new Num("87654321");
        Observerr numC = new Num("123123456");

        //注册观察者
        school.registerObserver(numA);
        school.registerObserver(numB);
        school.registerObserver(numC);

        //通知观察者
        school.setMsg("周六需要补课。");
    }
}

测试结果
用户号码12345678已获取信息:周六需要补课
用户号码87654321已获取信息:周六需要补课
用户号码123123456已获取信息:周六需要补课
  
Process finished with exit code 0

总结

  • 观察者模式设计后,会以集合的方式来管理用户(Observer),包括注册,移除 和通知。

  • 我们增加观察者,只需要创建一个观察者类,不需要改动其他类,遵守了ocp原则。

posted @ 2020-06-24 19:27  卑斯的卑微  阅读(112)  评论(0编辑  收藏  举报