織夢網(wǎng)站一級目錄十大少兒編程教育品牌
一、前言
觀察者模式,又稱為發(fā)布訂閱模式,是一種行為設(shè)置模式,允許對象之間建立一對多的依賴關(guān)系,這樣當(dāng)一個(gè)對象狀態(tài)改變時(shí),它的所有依賴者(觀察者)都會(huì)收到通知并自動(dòng)更新。
二、具體實(shí)現(xiàn)
1、發(fā)布訂閱案例
觀察者接口:
/*** @Description: 觀察者接口* @Date: 2024-12-27 10:08* @Author: gaoyufei**/
public interface Observer {void accept(String message);
}
觀察者實(shí)現(xiàn):
/*** @Description: 訂閱者* @Date: 2024-12-27 10:10* @Author: gaoyufei**/
public class Subscriber implements Observer{public String clientId;public Subscriber(String clientId){this.clientId=clientId;}@Overridepublic void accept(String message) {System.out.println("訂閱者:"+clientId+" 接受到消息:"+message);}
}
主題接口:
/*** @Description: 主題接口* @Date: 2024-12-27 10:15* @Author: gaoyufei**/
public interface Subject {void add(Observer observer);void del(Observer observer);void notify(String message);
}
主題實(shí)現(xiàn):
import java.util.ArrayList;
import java.util.List;/*** @Description: 主題,維護(hù)了訂閱者列表,通知訂閱者* @Date: 2024-12-27 10:16* @Author: gaoyufei**/
public class Topic implements Subject {private List<Observer> observerList=new ArrayList<>();@Overridepublic void add(Observer observer) {observerList.add(observer);}@Overridepublic void del(Observer observer) {observerList.remove(observer);}@Overridepublic void notify(String message) {observerList.stream().forEach(e->{e.accept(message);});}
}
模擬訂閱者訂閱主題,客戶端發(fā)布消息:
/*** @Description: 模擬訂閱者訂閱主題,客戶端發(fā)布消息* @Date: 2024-12-27 10:18* @Author: gaoyufei**/
public class Client {public static void main(String[] args) {Topic topic=new Topic();Subscriber subscriber1=new Subscriber("001");Subscriber subscriber2=new Subscriber("002");Subscriber subscriber3=new Subscriber("003");topic.add(subscriber1);topic.add(subscriber2);topic.add(subscriber3);topic.notify("您有一條新消息!");}
}
2、村長通知村民案例
觀察者接口:
/*** @Description: 觀察者接口* @Date: 2024-12-27 9:35* @Author: gaoyufei**/
public interface Observer {void accept(String message);
}
觀察者具體觀察者村民:
/*** @Description: 具體觀察者,村民,能接受消息* @Date: 2024-12-27 9:37* @Author: gaoyufei**/
public class Resident implements Observer{private String name;public Resident(String name){this.name=name;}@Overridepublic void accept(String message) {System.out.println("村民:"+this.name+" 收到信息:"+message);}
}
抽象主題:
/*** @Description: 抽象主題* @Date: 2024-12-27 9:39* @Author: gaoyufei**/
public interface Subject {void add(Observer observer);void del(Observer observer);void notify(String message);
}
主題的具體實(shí)現(xiàn),村長的記錄本:
import java.util.ArrayList;
import java.util.List;
/*** @Description: 主題的具體實(shí)現(xiàn),村長的記錄本,維護(hù)了村民信息,村長可以通過記錄本給村民群發(fā)信息* @Date: 2024-12-27 9:42* @Author: gaoyufei**/
public class RecordBook implements Subject {private List<Observer> observerList = new ArrayList<>();@Overridepublic void add(Observer observer) {observerList.add(observer);}@Overridepublic void del(Observer observer) {observerList.remove(observer);}@Overridepublic void notify(String message) {observerList.stream().forEach(e -> {e.accept(message);});}
}
村長登記村民信息,用記錄本給村民群發(fā)信息:
/*** @Description: 村長登記村民信息,用記錄本給村民群發(fā)信息* @Date: 2024-12-27 9:44* @Author: gaoyufei**/
public class VillageHead {public static void main(String[] args) {
// 1、村里,村長有一個(gè)記錄村民電話的本子,村民都需要登記一下。
// 在村里有什么事情的時(shí)候,村長就通過群發(fā)消息的方式通知村民。
// 2、村民就是觀察者、訂閱者,村長發(fā)布信息,記錄本就是主題,RecordBook recordBook=new RecordBook();Resident resident=new Resident("王滿銀");Resident resident1=new Resident("孫玉亭");Resident resident2=new Resident("孫玉厚");recordBook.add(resident);recordBook.add(resident1);recordBook.add(resident2);recordBook.notify("大家好,今天下午三點(diǎn)來村支部開會(huì),有重要事情通知!");}
}