日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

观察者模式--模拟3D彩票公众号

發布時間:2025/3/21 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 观察者模式--模拟3D彩票公众号 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一 觀察者模式定義:

  觀察者模式又叫發布-訂閱模式,它定義了一種一對多的依賴關系,多個觀察者對象可同時監聽某一主題對象,當該主題對象狀態發生變化時,相應的所有觀察者對象都可收到通知。

二 觀察者模式類圖

三 觀察者模式角色劃分

1)主題,抽象類或者接口

2)具體主題

3)觀察者

4)具體觀察者

四 觀察者模式實例

1)、服務號就是主題,業務就是推送消息

2)、觀察者只需要訂閱主題,只要有新的消息就會送來

3)、當不想要此主題消息時,取消訂閱

4)、只要服務號還在,就會一直有人訂閱

本實例模擬3D彩票服務,和部分訂閱者。

1.主題接口和觀察者接口

/**
* 主題接口,所有的主題必須實現此接口
*/
public interface Subject
{
  /**
  * 注冊一個觀察著
  *
  * @param observer
  */
  public void registerObserver(Observer observer);

  /**
  * 移除一個觀察者
  *
  * @param observer
  */
  public void removeObserver(Observer observer);

  /**
  * 通知所有的觀察著
  */
  public void notifyObservers();
}
2.所有觀察者都需要實現這個接口

?public interface Observer?{

  public void update(String msg);

}

3.3D服務號的實現


import java.util.ArrayList;

import java.util.List;


public class ObjectFor3D implements Subject
{
  private List<Observer> observers = new ArrayList<Observer>();
  /**
  * 3D彩票的號碼
  */
  private String msg;  

  @Override

  public void registerObserver(Observer observer){
    observers.add(observer);
  }

  @Override  public void removeObserver(Observer observer){

    int index = observers.indexOf(observer);
    if (index >= 0)
    {
      observers.remove(index);
    }
  }

  @Override
  public void notifyObservers()
  {
    for (Observer observer : observers)
    {
      observer.update(msg);
    }
  }
  /**
  * 主題更新消息
  *
  * @param msg
  */
  public void setMsg(String msg)
  {
    this.msg = msg;
    notifyObservers();
  }

}

4.模擬兩個使用者

4.1第一個使用者

public class Observer1 implements Observer
{
  private Subject subject;
  public Observer1(Subject subject)
  {
    this.subject = subject;
    subject.registerObserver(this);
  }

  @Override
  public void update(String msg)
  {
    System.out.println("observer1 得到 3D 號碼 -->" + msg + ", 我要記下來。");
   }
}
4.2第二個使用者


public class Observer2 implements Observer
{
  private Subject subject ;

  public Observer2(Subject subject)
  {
    this.subject = subject ;
    subject.registerObserver(this);
  }

  @Override
  public void update(String msg)
  {
    System.out.println("observer2 得到 3D 號碼 -->" + msg + "我要告訴舍友們。");
  }
}
服務號中維護了所有向它訂閱消息的使用者,當服務號有新消息時,通知所有的使用者。整個架構是一種松耦合,主題的實現不依賴與使用者,當增加新的使用者時,主題的代碼不需要改變;使用者如何處理得到的數據與主題無關。

5.測試代碼

public class Test
{
  public static void main(String[] args)
  {
    //模擬一個3D的服務號
    ObjectFor3D subjectFor3d = new ObjectFor3D();
    //客戶1
    Observer observer1 = new Observer1(subjectFor3d);
    Observer observer2 = new Observer2(subjectFor3d);

    subjectFor3d.setMsg("20140420的3D號碼是:127" );
    subjectFor3d.setMsg("20140421的3D號碼是:333" );
  }
}

五 觀察者模式的優缺點

觀察者模式優點
  抽象主題只依賴于抽象觀察者
  觀察者模式支持廣播通信
  觀察者模式使信息產生層和響應層分離
觀察者模式缺點
  如一個主題被大量觀察者注冊,則通知所有觀察者會花費較高代價
  如果某些觀察者的響應方法被阻塞,整個通知過程即被阻塞,其它觀察者不能及時被通知

?

實例鏈接:https://github.com/youlookwhat/DesignPattern/tree/master/app/src/main/java/com/example/jingbin/designpattern/observer

?

轉載于:https://www.cnblogs.com/zhouhaocode/p/9832362.html

總結

以上是生活随笔為你收集整理的观察者模式--模拟3D彩票公众号的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。