觀察者模式 基本含義 顧名思義就是一個觀察者角色 觀察 被觀察角色的變化 這是一種一對多的對象關系?
其目的是 是編碼更簡單 解耦合 同時提高閱讀性
舉個例子
對新生兒的情況進行觀察
首先你要有一個新生兒(被觀察對象)川抡, 護工/護理(觀察者) 鞋吉,記錄新生兒的何種生命活動情況并在發(fā)生變化時記錄數(shù)據(jù)(抽象實現(xiàn)類) 馍忽,反饋給醫(yī)生和新生兒父母 (使用實現(xiàn)類) 沐兵;這個流程就是觀察者模式 可以一對一 也可以一對多的關系
具體使用
觀察者模式有很多實現(xiàn)方式 看個人喜好 目前主流的還是 注冊 —- 通知 —- 銷毀注冊 的方式?
首先我們需要三個角色 第一 觀察者(新生兒) 第二 被觀察者(護工/護理) 第三 抽象實現(xiàn)類(生命活動變化) 第四 使用實現(xiàn)類(通知醫(yī)生/新生兒父母)
下面舉個例子
首先被觀察對象 (新生兒)
package com.observer;
public class MyMessage {
private String name;
private int age;
private double weight;
private double height;
public static Builder builder;
public MyMessage(Builder builder) {
? ? this.name = builder.name;
? ? this.age = builder.age;
? ? this.weight = builder.weight;
? ? this.height = builder.height;
}
public String getName() {
? ? return name;
}
public void setName(String name) {
? ? this.name = name;
}
public int getAge() {
? ? return age;
}
public void setAge(int age) {
? ? this.age = age;
}
public double getWeight() {
? ? return weight;
}
public void setWeight(double weight) {
? ? this.weight = weight;
}
public double getHeight() {
? ? return height;
}
public void setHeight(double height) {
? ? this.height = height;
}
public static class Builder{
? ? private String name;
? ? private int age;
? ? private double weight;
? ? private double height;
? ? public Builder setName(String name){
? ? ? ? this.name = name;
? ? ? ? return this;
? ? }
? ? public Builder setAge(int age){
? ? ? ? this.age = age;
? ? ? ? return this;
? ? }
? ? public Builder setWeight(double weight){
? ? ? ? this.weight = weight;
? ? ? ? return this;
? ? }
? ? public Builder setHeight(double height){
? ? ? ? this.height = height;
? ? ? ? return this;
? ? }
? ? public MyMessage build(){
? ? ? ? return new MyMessage(this);
? ? }
}
}
定義一個觀察者(護工/護理) 任務就是更新數(shù)據(jù)
/*?抽象接口 * @param 數(shù)據(jù)泛型 */ public interface ObServer {?
void upData(ObServerable obServerable,T data); }
定義一個抽象實現(xiàn)類 任務就是更新數(shù)據(jù)并刷新
import java.util.ArrayList;
? import java.util.List;
?public class ObServerable {
? ? ?List> obServers = new ArrayList>();
? ? ?public void register(ObServer obServer){
? ? ? ? ?if (obServer == null){
? ? ? ? ? ? ?throw new NullPointerException("ObServer == null");
? ? ? ? ?}
? ? ? ? ?synchronized (this){
? ? ? ? ? ? ?if (!obServers.contains(obServer)){
? ? ? ? ? ? ? ? ?obServers.add(obServer);
? ? ? ? ? ? ?}
? ? ? ? ?}
? ? ?}
? ? ?public synchronized void unRegister(ObServer obServer){
? ? ? ? ?obServers.remove(obServer);
? ? ?}
? ? ?public void notifyObserver(T data){
? ? ? ? ?for (ObServer obServer:obServers){
? ? ? ? ? ? ?obServer.upData(this,data);
? ? ? ? ?}
}
? ? ? }
再定義一個使用實現(xiàn)類 (醫(yī)生/新生兒父母)
模擬數(shù)據(jù)變化
// test
? ? public static void observerMode(int type){
? ? ? ? MyMessage.Builder builder = new MyMessage.Builder();? ? ? ? MyMessage message = null;? ? ? ? switch (type){
? ? ? ? ? ? case 0:
? ? ? ? ? ? ? ? message = builder.setAge(1).setName("小7").setHeight(40).setWeight(5).build();? ? ? ? ? ? ? ? break;? ? ? ? ? ? case 1:
? ? ? ? ? ? ? ? message = builder.setAge(1).setName("小7").setHeight(41).setWeight(5.5).build();? ? ? ? ? ? ? ? break;? ? ? ? }
? ? ? ? ObServerable obServerable = new ObServerable();? ? ? ? ObServer obServer = new ObServer() {
? ? ? ? ? ? @Override
? ? ? ? ? ? public void upData(ObServerable obServerable, MyMessage data) {
? ? ? ? ? ? ? ? System.out.print(data.getName()+" 在"+data.getAge()+"歲的時候桃序,身高"+data.getHeight()+"cm,體重"+data.getWeight()+"kg"+"\n");? ? ? ? ? ? }
? ? ? ? };? ? ? ? obServerable.register(obServer);? ? ? ? obServerable.notifyObserver(message);? ? ? ? obServerable.unRegister(obServer);? ? }