設計模式學習-觀察者模式

觀察者模式是一種多對一的關係,即多個觀察者對象   觀察  一個被觀察者對象,當被觀察者對象狀態發生變化時,能自動通知觀察者對象執行相應動作。

觀察者模式提供給關聯對象的一種同步通信的方式,下面來看結構圖(截自 程傑 大化設計模式)

兩個角色:

Subject:被觀察者,一般爲一個抽象類或接口,其中有一個聚集保存所有註冊的觀察者,一個方法用於通知所有的觀察者,Subject需要維持(添加,刪除,通知)一個觀察者對象的隊列列表。

Observer: 觀察者,抽象類或接口,有一個更新接口,更新自己的狀態。

 

Java的Util中已實現這兩個工具, Suject 爲 java.util.Observable,查看jdk手冊可知主要方法,其中要注意的是 setChanged() 方法,在通知之前必須調用該方法確認狀態改變,否則通知不生效。

Observer接口:就一個update()方法。

 

以下來看例子:被觀察者爲博主,觀察者爲粉絲

1、文章類 Article

package com.zewe.observer;
/**
 * 文章類
 * @author ZeWe
 *
 */
public class Article {
	
	private String title;
	
	private String content;

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}
	
	public String show(){
		return "標題:"+title+" , 內容:"+content;
	}

}

2、博主類:BlogUser

package com.zewe.observer;

import java.util.Observable;
/**
 * 博主
 * @author ZeWe
 *
 */
public class BlogUser extends Observable{
	
	private String name;

	public BlogUser(String name) {
		super();
		this.name = name;
	}
	public void publicBlog(String title, String content){
		Article art = new Article();
		art.setTitle(title);
		art.setContent(content);
		System.out.println(name +"發表文章, "+art.show());
		this.setChanged(); // 發表文章動作確認
		this.notifyObservers(art); // 通知所有觀察者
	}

}

3、粉絲類:Fans

package com.zewe.observer;

import java.util.Observable;
import java.util.Observer;
/**
 * 粉絲
 * @author ZeWe
 *
 */
public class Fans implements Observer{
	
	private String name;
	
	public Fans(String name) {
		super();
		this.name = name;
	}

	@Override
	public void update(Observable o, Object arg) {
		Article art = (Article) arg;
		System.out.println("粉絲"+name+"接收通知:"+art.show());
	}

}

4、執行方法

package com.zewe.observer;

public class MainTest {
	
	public static void main(String[] args) {
		
		BlogUser zewe = new BlogUser("ZeWe");
		
		Fans xiaoming = new Fans("小明");
		Fans tiezhu = new Fans("鐵柱");
		
		//粉絲關注
		zewe.addObserver(xiaoming);
		zewe.addObserver(tiezhu);
		
		zewe.publicBlog("觀察者模式", "設計模式學習觀察者模式 ......");
		
	}

}




// 結果:
/**
ZeWe發表文章, 標題:觀察者模式 , 內容:設計模式學習觀察者模式 ......
粉絲鐵柱接收通知:標題:觀察者模式 , 內容:設計模式學習觀察者模式 ......
粉絲小明接收通知:標題:觀察者模式 , 內容:設計模式學習觀察者模式 ......
**/

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章