Java设计模式:观察者模式
觀察者模式
觀察者模式又稱為發(fā)布/訂閱(Publish/Subscribe)模式
在對(duì)象之間定義了一對(duì)多的依賴,這樣一來,當(dāng)一個(gè)對(duì)象改變狀態(tài),依賴它的對(duì)象會(huì)收到通知并自動(dòng)更新。
如果這句話不好理解 可以這樣理解,
微信公眾號(hào)發(fā)布消息,訂閱者獲取消息,訂閱了就能收到消息,沒有訂閱就不能收到消息?
?
什么時(shí)候考慮使用觀察者模式?
當(dāng)對(duì)象間存在一對(duì)多關(guān)系時(shí),則使用觀察者模式
?
優(yōu)點(diǎn):?1、觀察者和被觀察者是抽象耦合的。 2、建立一套觸發(fā)機(jī)制。
缺點(diǎn):?1、如果一個(gè)被觀察者對(duì)象有很多的直接和間接的觀察者的話,將所有的觀察者都通知到會(huì)花費(fèi)很多時(shí)間。 2、如果在觀察者和觀察目標(biāo)之間有循環(huán)依賴的話,觀察目標(biāo)會(huì)觸發(fā)它們之間進(jìn)行循環(huán)調(diào)用,可能導(dǎo)致系統(tǒng)崩潰。 3、觀察者模式?jīng)]有相應(yīng)的機(jī)制讓觀察者知道所觀察的目標(biāo)對(duì)象是怎么發(fā)生變化的,而僅僅只是知道觀察目標(biāo)發(fā)生了變化。
?
下面寫一個(gè)案例:一個(gè)微信公眾號(hào)服務(wù),不定時(shí)發(fā)布一些消息,關(guān)注公眾號(hào)就可以收到推送消息,取消關(guān)注就收不到推送消息
1 抽象被觀察這接口
//抽象被觀察者接口
public interface Observerable {//訂閱void registerObserver(Observer o);//取消訂閱void removeObserver(Observer o);//更新void notifyObserver();
}
?2 抽象觀察者接口
//抽象觀察者接口
public interface Observer {//接受變動(dòng)通知public void update(String message);
}
3? 觀察者實(shí)現(xiàn)接口
// 觀察者,訂閱公眾號(hào)的用戶
public class User implements Observer {private String name;private String message;public User(String name) {// TODO Auto-generated constructor stubthis.name = name;}@Overridepublic void update(String message) {// TODO Auto-generated method stubthis.message = message;read();}private void read() {// TODO Auto-generated method stubSystem.out.println(name + " 收到推送消息: " + message);}}
4 被觀察者實(shí)現(xiàn)接口
import java.util.ArrayList;
import java.util.List;
// 被觀察者, 微信公眾號(hào)
public class WechatServer implements Observerable {//注意到這個(gè)List集合的泛型參數(shù)為Observer接口,設(shè)計(jì)原則:面向接口編程而不是面向?qū)崿F(xiàn)編程private List<Observer> list;private String message;public WechatServer() {list = new ArrayList<Observer>();}@Overridepublic void registerObserver(Observer o){list.add(o);}@Overridepublic void removeObserver(Observer o) {if(!list.isEmpty())list.remove(o);}//遍歷@Overridepublic void notifyObserver(){for(int i = 0; i < list.size(); i++) {Observer oserver = list.get(i);oserver.update(message);}}public void setInfomation(String s) {this.message = s;System.out.println("微信服務(wù)更新消息: " + s);//消息更新,通知所有觀察者notifyObserver();}}
?
測(cè)試
public class Main{ public static void main(String[] args) {//創(chuàng)建微信服務(wù)器對(duì)象 WechatServer server = new WechatServer();//創(chuàng)建多個(gè)用戶對(duì)象User userZhang = new User("ZhangSan");User userLi = new User("LiSi");User userWang = new User("WangWu");//訂閱者用戶接受消息server.registerObserver(userZhang);server.registerObserver(userLi);server.registerObserver(userWang);//微信服務(wù)器發(fā)送消息server.setInfomation("PHP是世界上最好用的語言!");System.out.println("------------華麗的分割線---------------");//張三把訂閱號(hào)給取消了server.removeObserver(userZhang);//微信服務(wù)器修改消息server.setInfomation("JAVA是世界上最好用的語言!");}
}
?
打印結(jié)果
?
參考地址忘記了,本著學(xué)習(xí)記錄了一下。
總結(jié)
以上是生活随笔為你收集整理的Java设计模式:观察者模式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 地毯多少钱一平米啊?
- 下一篇: 微信小程序点击右下角的图片移动到当前位置