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

文章目录

  • 前言
  • 一、观察者模式
  • 二、观察者模式示例
    • 1.定义通知subject
    • 2.定义观察者
    • 3 定义具体的观察者
    • 4 测试
  • 总结


前言

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


一、观察者模式

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

二、观察者模式示例

模拟发送通知,当通知更新时,自动通过微信,qq,短信发送通知消息。类图如下:
Java设计模式-观察者模式(Observer)_第1张图片

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 存放观察者们。

你可能感兴趣的:(Java,java,设计模式,观察者模式)