Java 設計模式02 觀察者模式

1 觀察者模式 簡介

觀察者模式是將觀察者與被觀察者分離開,實現了對象間一種一對多的組合關係,當被觀察者的狀態發生變化時,所有依賴於它的觀察者就會檢測到變化並且刷新自己的狀態。

1.1 四個重要角色

角色 功能
抽象 被觀察者 定義添加和刪除觀察者等功能
抽象 觀察者 定義觀察者收到被觀察者的通知後要做什麼事情
具體 被觀察者 抽象被觀察者的具體實現
具體 觀察者 抽象觀察者的具體實現

2 觀察者模式 UML 圖

2.1 實現方法 (interface)

interface模式

2.2 實現方法 (abstract)

abstract模式

2.3 大概步驟

觀察者模式大概的步驟就是
1、創建被觀察者
2、創建觀察者
3、爲被觀察者添加觀察者
4、被觀察者通知所有的觀察者發生變化

3 觀察者模式 實現

3.1 抽象 觀察者 (接口類)

package com.xu.modle;

/**
 * 抽象 觀察者 接口
 * @author hyacinth
 * @date 2019年10月10日12:00:09
 *
 */
public interface Observer {

	/**
	 * 當被觀察者調用notify_observers()方法時,觀察者的update()方法會被回調。
	 * @param message 提示信息
	 */
	public void update(String message);

}

3.2 具體 觀察者 (實現類)

package com.xu.modle;

/**
 * 觀察者
 * @author hyacinth
 * @date 2019年10月10日12:00:09
 *
 */
public class User implements Observer {

	/**
	 * 觀察者名稱
	 */
	private String name;
	
	public User(String name) {
		this.name=name;
	}
	
	@Override
	public void update(String message) {
		System.out.println("觀察者:"+this.name+"\t"+message);
	}

}

3.3 抽象 被觀察者 (接口類)

package com.xu.modle;

/**
 * 抽象 被觀察者 接口
 * @author hyacinth
 * @date 2019年10月10日12:00:09
 * 
 */
public interface Observed {
	
	/**
	 * 添加觀察者
	 * @param observer 觀察者
	 */
	public void add_observer(Observer observer);
	
	/**
	 * 移除觀察者
	 * @param observer 觀察者
	 */
    public void remove_observer(Observer observer);
    
    /**
     * 通知觀察者
     */
    public void notify_observer();
}

3.4 具體 被觀察者 (實現類)

package com.xu.modle;

import java.util.LinkedList;
import java.util.List;

/**
 * 被觀察者
 * @author hyacinth
 * @date 2019年10月10日12:00:09
 *
 */
public class Server implements Observed {

	private List<Observer> list;
	private String message;

	public Server() {
		list = new LinkedList<Observer>(); 
	}
	
	@Override
	public void add_observer(Observer observer) {
		list.add(observer);
	}

	@Override
	public void remove_observer(Observer observer) {
		if(!list.isEmpty()) {
			list.remove(observer);
		}
	}

	@Override
	public void notify_observer() {
		list.forEach((item)->{
			Observer observer=item;
			observer.update(this.message);
		});
	}

	public void set_message(String message) {
		this.message=message;
		notify_observer();
	}
	
}

3.5 測試類

package com.xu.modle;

public class Test {
	
	public static void main(String[] args) {
		Server server = new Server();

		Observer user1 = new User("張三");
		Observer user2 = new User("李四");
		Observer user3 = new User("王五");

		server.add_observer(user1);
		server.add_observer(user2);
		server.add_observer(user3);
		server.set_message("測試消息12");
		System.out.println();
		server.remove_observer(user2);
		server.set_message("測試消息2");
	}
	
}

3.6 測試結果

觀察者:張三	測試消息1
觀察者:李四	測試消息1
觀察者:王五	測試消息1

觀察者:張三	測試消息2
觀察者:王五	測試消息2
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章