博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式——观察者模式
阅读量:4877 次
发布时间:2019-06-11

本文共 2559 字,大约阅读时间需要 8 分钟。

1. 介绍

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

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

2. 类定义

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

public interface Observer {    void update(String msg);}
public abstract class Observerable {
final List
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

你可能感兴趣的文章
从抖音关闭评论,看服务治理的重要性
查看>>
MIUI10系统怎么样刷成开发版获得ROOT权限
查看>>
前端内容思维导图
查看>>
Linux下装VirtualBox
查看>>
ORA-12514: TNS:listener does not currently know of service requested in connect descriptor
查看>>
linux下面安装配置LAMP环境
查看>>
libco之协程分析
查看>>
java人机猜拳游戏002user
查看>>
iOS UIButton的使用详解
查看>>
Spring Boot 2(一):Spring Boot 2.0新特性
查看>>
排序问题
查看>>
Java 序列化Serializable详解(附详细例子)
查看>>
FMDB的使用
查看>>
CodeForces--TechnoCup--2016.10.15--ProblemA--Transformation: from A to B
查看>>
android Makefile 的流程—how android makefile work---makefile progress in android
查看>>
Picasso解决 TextView加载html图片异步显示
查看>>
SQL Server如何进行时间比较的代码
查看>>
SSL证书
查看>>
NSQ
查看>>
Trie树【字典树】浅谈
查看>>