定義
當(dāng)一個對象變化時弹渔,其它依賴該對象的對象都會收到通知媒熊,并且隨著變化!對象之間是一種一對多的關(guān)系谜酒。觀察者模式又叫做發(fā)布-訂閱(Publish/Subscribe)模式叹俏、模型-視圖(Model/View)模式、源-監(jiān)聽器(Source/Listener)模式或從屬者(Dependents)模式僻族。
角色
- Subject: 目標(biāo)
- ConcreteSubject: 具體目標(biāo)
- Observer: 觀察者
- ConcreteObserver: 具體觀察者
實例
創(chuàng)建observer
public interface Observer {
public void update(String massage);
}
創(chuàng)建ConcreteObserver類
public class ConcreteObserver implements Observer {
private String name;
public ConcreteObserver(String name) {
this.name = name;
}
@Override
public void update(String massage) {
System.out.println(massage+" "+name);
}
}
創(chuàng)建subject
public interface Subject {
/**
* @author Royle.Huang
* @date 2019/1/1 17:10
* @description: 增加訂閱
*/
void attach(Observer observer);
/**
* @author Royle.Huang
* @date 2019/1/1 17:11
* @description: 刪除訂閱
*/
void dettach(Observer observer);
/**
* @author Royle.Huang
* @date 2019/1/1 17:11
* @description: 通知訂閱者
*/
void notify(String massage);
}
創(chuàng)建ConcreteSubject類
public class ConcreteSubject implements Subject {
List<Observer> list = new ArrayList<>();
@Override
public void attach(Observer observer) {
list.add(observer);
}
@Override
public void dettach(Observer observer) {
list.remove(observer);
}
@Override
public void notify(String massage) {
for (Observer observer : list) {
observer.update(massage);
}
}
}
測試代碼
public class Test {
public static void main(String[] args) {
Observer observer = new ConcreteObserver("goudan");
Observer observer2 = new ConcreteObserver("luffy");
Observer observer3 = new ConcreteObserver("java");
Subject subject = new ConcreteSubject();
subject.attach(observer);
subject.attach(observer2);
subject.attach(observer3);
subject.notify("a message for");
}
}
運行結(jié)果
a message for goudan
a message for luffy
a message for java