为了账号安全,请及时绑定邮箱和手机立即绑定

设计模式——观察者模式

标签:
设计

1. 介绍

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)

当一个对象被修改时,则会自动通知它的依赖对象(广播)。观察者模式属于行为型模式。

回到顶部

2. 类定义

定义观察者接口和被观察者抽象类

public interface Observer {    void update(String msg);
}

复制代码

public abstract class Observerable {
    final List<Observer>  observerList = new ArrayList<>();
    void registerObserver(Observer observer) {}
    void removeObserver(Observer observer) {}
    void notifyObserver(String msg) {}
}

复制代码

定义实现被观察者的具体类

复制代码

public class WechatServer extends Observerable{
    @Override    public void registerObserver(Observer observer) {        if (!observerList.contains(observer)) {
            observerList.add(observer);
            System.out.println("add " + observer + " success");
        }
    }

    @Override    public void removeObserver(Observer observer) {        if (!observerList.isEmpty()) {
            observerList.remove(observer);
            System.out.println("remove " + observer + " sucess");
        }
    }

    @Override    public void notifyObserver(String msg) {        for (Observer observer : observerList) {
            observer.update(msg);
        }
    }
}

复制代码

定义实现观察者的2个具体类

复制代码

public class PhoneObserver implements Observer{
    @Override    public void update(String msg) {
        System.out.println("phone receive:" + msg);
    }
}

复制代码

复制代码

public class BookObserver implements Observer{
    @Override    public void update(String msg) {
        System.out.println("Book receive " + msg);
    }
}

复制代码

回到顶部

3.测试

复制代码

public class ObserverTest {    public static void main(String[] args) {
        Observerable observerable = new WechatServer();
        Observer phone = new PhoneObserver();
        Observer book = new BookObserver();
        observerable.registerObserver(phone);
        observerable.registerObserver(book);

        observerable.notifyObserver("hello world");

        observerable.removeObserver(book);
        observerable.notifyObserver("the second try");

        observerable.removeObserver(book);
        observerable.notifyObserver("the second try");

    }
}

复制代码

结果


add com.jihite.ObserverPattern.PhoneObserver@5674cd4d successadd com.jihite.ObserverPattern.BookObserver@63961c42 successphone receive:hello worldBook receive hello worldremove com.jihite.ObserverPattern.BookObserver@63961c42 sucessphone receive:the second tryremove com.jihite.ObserverPattern.BookObserver@63961c42 sucessphone receive:the second try

回到顶部

4.总结

优点: 

  • 观察者和被观察者是抽象耦合的

  • 建立一套触发机制

缺点

  • 如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。

  • 如果在被观察者之间有循环依赖的话,被观察者会触发它们之间进行循环调用,导致系统崩溃。在使用观察者模式是要特别注意这一点

  • 虽然观察者模式可以随时使观察者知道所观察的对象发生了变化,但是观察者模式没有相应的机制使观察者知道所观察的对象是怎么发生变化的

原文出处: https://www.cnblogs.com/kaituorensheng/p/9895747.html  

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消