用處:aop,鉤子函數(shù),監(jiān)聽器憋沿,...
先上類圖
觀察者模式.jpg
案例代碼
先定義監(jiān)聽者接口
package com.wwj.observermode;
public interface Listener {
public void action(Event event);
}
定義接口傳入的事件源(需要的時候可以拿到當前監(jiān)聽的對象)
package com.wwj.observermode;
public class Event {
private Object source = null;
public Event(Object source){
source = source;
}
public Object getSource(){
return source;
};
public void setSource(Object o){
source = o;
}
}
開始寫具體代碼,先定義貓的實體類沪猴,跳的時候觸發(fā)鉤子函數(shù)
package com.wwj.observermode;
import java.util.ArrayList;
import java.util.List;
public class Cat {
//添加監(jiān)聽者集合
List<Listener> listeners = new ArrayList<>();
public Cat(){
this.addListener(new WaterListener());
this.addListener(new FoodListener());
}
//貓來回跳需要喂食喂水
public void jump(){
Event event = new Event(this);
for(Listener listener:listeners){
listener.action(event);
}
}
//添加監(jiān)聽者
public void addListener(Listener listener){
listeners.add(listener);
}
}
定義兩個具體的監(jiān)聽者
package com.wwj.observermode;
public class FoodListener implements Listener {
@Override
public void action(Event event) {
Object source = event.getSource();
Cat cat = (Cat)source;
System.out.println("喂食物");
}
}
package com.wwj.observermode;
public class WaterListener implements Listener{
@Override
public void action(Event event) {
Object source = event.getSource();
Cat cat = (Cat)source;
System.out.println("喂水");
}
}
這樣辐啄,調(diào)用貓的跳的動作時會觸發(fā)要去喂水和喂食,耦合度低
package com.wwj.observermode;
public class main {
public static void main(String[] args) {
Cat cat = new Cat();
cat.jump();
}
}
后續(xù)再新增鉤子函數(shù)就比較方便了运嗜。