观察者模式--模拟3D彩票公众号
一 觀察者模式定義:
觀察者模式又叫發(fā)布-訂閱模式,它定義了一種一對(duì)多的依賴關(guān)系,多個(gè)觀察者對(duì)象可同時(shí)監(jiān)聽某一主題對(duì)象,當(dāng)該主題對(duì)象狀態(tài)發(fā)生變化時(shí),相應(yīng)的所有觀察者對(duì)象都可收到通知。
二 觀察者模式類圖
三 觀察者模式角色劃分
1)主題,抽象類或者接口
2)具體主題
3)觀察者
4)具體觀察者
四 觀察者模式實(shí)例
1)、服務(wù)號(hào)就是主題,業(yè)務(wù)就是推送消息
2)、觀察者只需要訂閱主題,只要有新的消息就會(huì)送來
3)、當(dāng)不想要此主題消息時(shí),取消訂閱
4)、只要服務(wù)號(hào)還在,就會(huì)一直有人訂閱
本實(shí)例模擬3D彩票服務(wù),和部分訂閱者。
1.主題接口和觀察者接口
/**
* 主題接口,所有的主題必須實(shí)現(xiàn)此接口
*/
public interface Subject
{
/**
* 注冊(cè)一個(gè)觀察著
*
* @param observer
*/
public void registerObserver(Observer observer);
/**
* 移除一個(gè)觀察者
*
* @param observer
*/
public void removeObserver(Observer observer);
/**
* 通知所有的觀察著
*/
public void notifyObservers();
}
2.所有觀察者都需要實(shí)現(xiàn)這個(gè)接口
?public interface Observer?{
public void update(String msg);
}
3.3D服務(wù)號(hào)的實(shí)現(xiàn)
import java.util.ArrayList;
import java.util.List;
public class ObjectFor3D implements Subject
{
private List<Observer> observers = new ArrayList<Observer>();
/**
* 3D彩票的號(hào)碼
*/
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.模擬兩個(gè)使用者
4.1第一個(gè)使用者
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 號(hào)碼 -->" + msg + ", 我要記下來。");
}
}
4.2第二個(gè)使用者
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 號(hào)碼 -->" + msg + "我要告訴舍友們。");
}
}
服務(wù)號(hào)中維護(hù)了所有向它訂閱消息的使用者,當(dāng)服務(wù)號(hào)有新消息時(shí),通知所有的使用者。整個(gè)架構(gòu)是一種松耦合,主題的實(shí)現(xiàn)不依賴與使用者,當(dāng)增加新的使用者時(shí),主題的代碼不需要改變;使用者如何處理得到的數(shù)據(jù)與主題無關(guān)。
5.測(cè)試代碼
public class Test
{
public static void main(String[] args)
{
//模擬一個(gè)3D的服務(wù)號(hào)
ObjectFor3D subjectFor3d = new ObjectFor3D();
//客戶1
Observer observer1 = new Observer1(subjectFor3d);
Observer observer2 = new Observer2(subjectFor3d);
subjectFor3d.setMsg("20140420的3D號(hào)碼是:127" );
subjectFor3d.setMsg("20140421的3D號(hào)碼是:333" );
}
}
五 觀察者模式的優(yōu)缺點(diǎn)
觀察者模式優(yōu)點(diǎn)
抽象主題只依賴于抽象觀察者
觀察者模式支持廣播通信
觀察者模式使信息產(chǎn)生層和響應(yīng)層分離
觀察者模式缺點(diǎn)
如一個(gè)主題被大量觀察者注冊(cè),則通知所有觀察者會(huì)花費(fèi)較高代價(jià)
如果某些觀察者的響應(yīng)方法被阻塞,整個(gè)通知過程即被阻塞,其它觀察者不能及時(shí)被通知
?
實(shí)例鏈接: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彩票公众号的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WordCount by C# 结对编程
- 下一篇: upload-labs-master文件