Java设计模式-观察者模式(Observer)


前言

观察者模式在实际应用中比较多的,比如消息订阅,当消息更新变更会自动通知所有的订阅者,比如天气变化,qq微信发送群公告消息等等,当群里发送群消息所有好友都可以接收到消息通知。


一、观察者模式

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

二、观察者模式示例

模拟发送通知,当通知更新时,自动通过微信,qq,短信发送通知消息。类图如下:
uml

1.定义通知subject

代码如下:

package behavior.ObserverPattern;

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

/**
 * 定义一个通知对象
 */
public  class Notice {

  private List<NoticeObserver> observers
          = new ArrayList<NoticeObserver>();
  private String msg;

  public String getMsg() {
    return msg;
  }

  public void setMsg(String msg) {
    this.msg = msg;
    this.notifyAllObservers();
  }

  /**
   * 添加观察者
   * @param observer
   */
  public void attach(NoticeObserver observer){
    observers.add(observer);
  }

  /**
   * 发送所有的通知
   */
  public void notifyAllObservers(){
    for (NoticeObserver observer : observers) {
      observer.sendNotice(msg);
    }
  }

}

2.定义观察者

代码如下:


/**
 * observer观察者
 */
public abstract class NoticeObserver {
    protected  Notice notice;
    public abstract void sendNotice(String msg);
}

3 定义具体的观察者

微信观察者代码如下:

/**
 * 微信通知
 */
public class WechatNoticeObserver extends NoticeObserver{

    public WechatNoticeObserver(Notice notice) {
        this.notice = notice;
        this.notice.attach(this);
    }

    @Override
    public void sendNotice(String msg) {
        System.out.println("微信接收消息:"+msg);
    }
}

qq观察者代码如下:

/**
 * qq 通知
 */
public class QQNoticeObsever extends NoticeObserver {
    public QQNoticeObsever(Notice notice) {
        this.notice = notice;
        this.notice.attach(this);
    }

    @Override
    public void sendNotice(String msg) {
        System.out.println("QQ更新通知消息:"+msg);
    }
}

短信观察者代码如下:

/**
 * 短信通知
 */
public class MsgNoticeObserver extends NoticeObserver{

    public MsgNoticeObserver(Notice notice) {
        this.notice = notice;
        this.notice.attach(this);
    }

    @Override
    public void sendNotice(String msg) {
        System.out.println("短信接收消息:"+msg);
    }
}

4 测试

public class ObserverPatternTest {
    public static void main(String[] args) {
        Notice notice = new Notice();

        new QQNoticeObsever(notice);
        new WechatNoticeObserver(notice);
        new MsgNoticeObserver(notice);

        System.out.println("发送消息通知");
        notice.setMsg("全体成员中午十二点开会....");
        System.out.println("更新消息通知");
        notice.setMsg("由于某某原因,全体成员中午十二点的会议推迟到下午两点....");
    }
}

QQ更新通知消息:全体成员中午十二点开会....
微信接收消息:全体成员中午十二点开会....
短信接收消息:全体成员中午十二点开会....
更新消息通知
QQ更新通知消息:由于某某原因,全体成员中午十二点的会议推迟到下午两点....
微信接收消息:由于某某原因,全体成员中午十二点的会议推迟到下午两点....
短信接收消息:由于某某原因,全体成员中午十二点的会议推迟到下午两点....


总结

主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。何时使用:个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知',进行广播通知。如何解决:使用面向对象技术,可以将这种依赖关系弱化。关键在于在抽象类里有一个 ArrayList 存放观察者们。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小刘同学要加油呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值