观察者模式--模拟3D彩票公众号
一 觀察者模式定義:
觀察者模式又叫發(fā)布-訂閱模式,它定義了一種一對多的依賴關(guān)系,多個觀察者對象可同時監(jiān)聽某一主題對象,當(dāng)該主題對象狀態(tài)發(fā)生變化時,相應(yīng)的所有觀察者對象都可收到通知。
二 觀察者模式類圖
三 觀察者模式角色劃分
1)主題,抽象類或者接口
2)具體主題
3)觀察者
4)具體觀察者
四 觀察者模式實例
1)、服務(wù)號就是主題,業(yè)務(wù)就是推送消息
2)、觀察者只需要訂閱主題,只要有新的消息就會送來
3)、當(dāng)不想要此主題消息時,取消訂閱
4)、只要服務(wù)號還在,就會一直有人訂閱
本實例模擬3D彩票服務(wù),和部分訂閱者。
1.主題接口和觀察者接口
/**
* 主題接口,所有的主題必須實現(xiàn)此接口
*/
public interface Subject
{
/**
* 注冊一個觀察著
*
* @param observer
*/
public void registerObserver(Observer observer);
/**
* 移除一個觀察者
*
* @param observer
*/
public void removeObserver(Observer observer);
/**
* 通知所有的觀察著
*/
public void notifyObservers();
}
2.所有觀察者都需要實現(xiàn)這個接口
?public interface Observer?{
public void update(String msg);
}
3.3D服務(wù)號的實現(xiàn)
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 + "我要告訴舍友們。");
}
}
服務(wù)號中維護(hù)了所有向它訂閱消息的使用者,當(dāng)服務(wù)號有新消息時,通知所有的使用者。整個架構(gòu)是一種松耦合,主題的實現(xiàn)不依賴與使用者,當(dāng)增加新的使用者時,主題的代碼不需要改變;使用者如何處理得到的數(shù)據(jù)與主題無關(guān)。
5.測試代碼
public class Test
{
public static void main(String[] args)
{
//模擬一個3D的服務(wù)號
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" );
}
}
五 觀察者模式的優(yōu)缺點(diǎn)
觀察者模式優(yōu)點(diǎn)
抽象主題只依賴于抽象觀察者
觀察者模式支持廣播通信
觀察者模式使信息產(chǎn)生層和響應(yīng)層分離
觀察者模式缺點(diǎn)
如一個主題被大量觀察者注冊,則通知所有觀察者會花費(fèi)較高代價
如果某些觀察者的響應(yīng)方法被阻塞,整個通知過程即被阻塞,其它觀察者不能及時被通知
?
實例鏈接:https://github.com/youlookwhat/DesignPattern/tree/master/app/src/main/java/com/example/jingbin/designpattern/observer
?
轉(zhuǎn)載于:https://www.cnblogs.com/zhouhaocode/p/9832362.html
總結(jié)
以上是生活随笔為你收集整理的观察者模式--模拟3D彩票公众号的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WordCount by C# 结对编程
- 下一篇: JS正则表达式详解