轉自:
http://www.java265.com/JavaCourse/202206/3741.html
下文筆者講述觀察者模式的簡介說明,如下所示
觀察者模式
觀察者模式:
稱為發布/訂閱(Publish/Subscribe)模式
用于定義一個一對多的依賴關系,
當一個物件狀態發生變化時,依賴它的物件都會收到通知
觀察者模式優點:
1.觀察者和被觀察者是抽象耦合的
2.建立一套觸發機制
觀察者模式缺點:
1.當一個被觀察者物件有很多的直接和間接的觀察者的話
將所有的觀察者都通知到會花費很多時間,
2.當觀察者和觀察目標之間有回圈依賴的話,觀察目標會觸發它們之間進行回圈呼叫,可能導致系統崩潰
3.觀察者模式沒有相應的機制讓觀察者知道所觀察的目標物件是怎么發生變化的,而僅僅只是知道觀察目標發生了變化,
如:
公眾號發布訊息,關注它的微信都可以收到更新通知
這就是一種典型的觀察者模式的實作
那么如何實作觀察者模式呢?下文將一一道來,如下所示:
例:
觀察者模式的示例代碼
//抽象被觀察者介面
public interface Observerable {
//訂閱
void registerObserver(Observer o);
//取消訂閱
void removeObserver(Observer o);
//更新
void notifyObserver();
}
2 抽象觀察者介面
//抽象觀察者介面
public interface Observer {
//接受變動通知
public void update(String message);
}
3觀察者實作介面
// 觀察者
public class User implements Observer {
private String name;
private String message;
public User(String name) {
// TODO Auto-generated constructor stub
this.name = name;
}
@Override
public void update(String message) {
// TODO Auto-generated method stub
this.message = message;
read();
}
private void read() {
// TODO Auto-generated method stub
System.out.println(name + " 收到推送訊息: " + message);
}
}
4 被觀察者實作介面
import java.util.ArrayList;
import java.util.List;
// 被觀察者, 微信公眾號
public class WechatServer implements Observerable {
//注意到這個List集合的泛型引數為Observer介面,設計原則:面向介面編程而不是面向實作編程
private List<Observer> list;
private String message;
public WechatServer() {
list = new ArrayList<Observer>();
}
@Override
public void registerObserver(Observer o){
list.add(o);
}
@Override
public void removeObserver(Observer o) {
if(!list.isEmpty())
list.remove(o);
}
//遍歷
@Override
public 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("微信服務更新訊息: " + s);
//訊息更新,通知所有觀察者
notifyObserver();
}
}
測驗
public class Main{
public static void main(String[] args) {
//創建微信服務器物件
WechatServer server = new WechatServer();
//創建多個用戶物件
User a = new User("maomao");
User b = new User("java265");
User c = new User("hahaha");
//訂閱者用戶接受訊息
server.registerObserver(a);
server.registerObserver(b);
server.registerObserver(c);
//微信服務器發送訊息
server.setInfomation("我要發送一個訊息");
System.out.println("------------華麗的分割線---------------");
/
/c把訂閱號給取消了
server.removeObserver(c);
//微信服務器修改訊息
server.setInfomation("發送訊息二");
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/498983.html
標籤:設計模式
下一篇:設計模式之概述篇
