1. 程式人生 > >java23中設計模式之觀察者模式

java23中設計模式之觀察者模式

什麼叫觀察者模式?

當被觀察者的資料更新時,將會通知觀察該主題的所有觀察者。就像---微信公眾號就是被觀察者---關注該公眾號的就是觀察者---》

當公眾號更新文章時,關注的人就會獲得該資訊。這就是觀察者模式的應用。

用圖說明:

下面將用程式碼來解釋上面的內容:

1.觀察者

package com.observer.inter;
/**
 * 觀察者
 * 1.提供更新方法
 * @author zy
 *
 */
public interface Observer {
   void update(String msg);
}

2.被觀察者

package com.observer.concretesubject;
/**
 * 觀察者模式中:被觀察者是抽象類,當然介面也可以,但是正宮就是抽象類
 * 被觀察者
 * 1.定義註冊觀察者方法
 * 2.定義移除觀察者方法
 * 3.通知觀察者方法
 * 4.傳送通知(抽象)
 * @author zy
 *
 */

import java.util.ArrayList;
import java.util.List;

import com.observer.inter.Observer;

public abstract class ConcreteSubject {
	//定義一個集合用來作為觀察者者的容器
	List<Observer> list=new ArrayList<>();
	
//	  1.定義註冊觀察者方法
	public void registerObserver(Observer ob){
		list.add(ob);
	}
//	  2.定義移除觀察者方法
	public void removeObserver(Observer ob){
		list.remove(ob);
	}
//	  3.通知觀察者方法
	protected void notifyObserver(String msg){
		for (Observer ob : list) {
			ob.update(msg);
		}
	}
//	  4.傳送通知(抽象)
	public abstract  void setInfo(String msg);
}

3.觀察者實現類

package com.observer.inter;
/**
 * 觀察者實現類
 * @author zy
 *
 */
public class Users implements Observer{
    private String name;
	public Users(String name) {
		this.name=name;
	}
	@Override
	public void update(String msg) {
	 System.out.println(this.name+":接收到一條資訊----》"+msg);
		
	}

}

 4.被觀察者實現類

package com.observer.test;

import com.observer.concretesubject.ConcreteSubject;
/**
 * 仿微信公眾號推送訊息,被觀察者
 * @author zy
 *
 */
public class WeChatServer extends ConcreteSubject{
//實現訊息推送
	@Override
	public void setInfo(String msg) {
	System.out.println("推送資訊中。。。。。。");
		notifyObserver(msg);
	}

}

5.測試類

package com.observer.test;

import com.observer.inter.Users;

public class Test {
	public static void main(String[] args) {
		//被觀察者
		WeChatServer weChatServer=new WeChatServer();
	
		//定義觀察者
		Users u1=new Users("張三");
		Users u2=new Users("胡月");
		Users u3=new Users("Bob");
		//註冊觀察者--關注公眾號
		weChatServer.registerObserver(u1);
		weChatServer.registerObserver(u2);
		weChatServer.registerObserver(u3);
		//通知觀察者
		weChatServer.setInfo("好好學習");
		//移除觀察者--取消關注
		weChatServer.removeObserver(u3);
		weChatServer.setInfo("天天向上");
		
	}
}

執行結果: 

推送資訊中。。。。。。
張三:接收到一條資訊----》好好學習
胡月:接收到一條資訊----》好好學習
Bob:接收到一條資訊----》好好學習
推送資訊中。。。。。。
張三:接收到一條資訊----》天天向上
胡月:接收到一條資訊----》天天向上