Java 設計模式02 觀察者模式
1 觀察者模式 簡介
觀察者模式是將觀察者與被觀察者分離開,實現了對象間一種一對多的組合關係,當被觀察者的狀態發生變化時,所有依賴於它的觀察者就會檢測到變化並且刷新自己的狀態。
1.1 四個重要角色
角色 | 功能 |
---|---|
抽象 被觀察者 | 定義添加和刪除觀察者等功能 |
抽象 觀察者 | 定義觀察者收到被觀察者的通知後要做什麼事情 |
具體 被觀察者 | 抽象被觀察者的具體實現 |
具體 觀察者 | 抽象觀察者的具體實現 |
2 觀察者模式 UML 圖
2.1 實現方法 (interface)
2.2 實現方法 (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