观察者模式- 2020-11-24 23:08- 设计模式: 设计模式,观察者模式
意在指一对多的关系,即一个目标对多个观察者,多个观察者观察同一个目标,当目标发生改变时,观察者会感知到并且做出相应的处理。 通常observer,event,监听,发布订阅等,都属于观察者模式的实现。
event
监听类
import com.google.common.eventbus.Subscribe;
/**
* 事件监听
*
* @author Bai
* @date 2020/11/24 22:06
*/
public class GuavaEvent {
@Subscribe
public void event(String event) {
System.out.println("执行了" + event);
}
}
被监听类
import com.google.common.eventbus.EventBus;
/**
* 被监听类
*
* @author Bai
* @date 2020/11/24 23:13
*/
public class GuavaEventBus extends EventBus {
}
测试
@Test
public void test() {
GuavaEventBus eventBus = new GuavaEventBus();
GuavaEvent event = new GuavaEvent();
eventBus.register(event);
eventBus.post("监听");
}
observer
观察者
import java.util.Observable;
import java.util.Observer;
/**
* 猫 观察者
*
* @author Bai
* @date 2020/11/24 22:41
*/
public class Cat implements Observer {
@Override
public void update(Observable o, Object arg) {
CatFoodBowl catFoodBowl = (CatFoodBowl) o;
Integer food = (Integer) arg;
System.out.println("在" + catFoodBowl.getName() + "加了" + food + "猫粮后,猫开始吃猫粮了");
}
}
被观察者
import java.util.Observable;
/**
* 猫粮盆 被观察者
*
* @author Bai
* @date 2020/11/24 22:38
*/
public class CatFoodBowl extends Observable {
private String name;
private Integer food;
public void addFood(String name, Integer food) {
this.name = name;
System.out.println(name + "加了" + food + "盆猫粮 ");
//false 修改为 true 预示着有变化
setChanged();
//通知所有观察者
notifyObservers(food);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
测试
@Test
public void test() {
CatFoodBowl catFoodBowl = new CatFoodBowl();
Cat cat = new Cat();
catFoodBowl.addObserver(cat);
catFoodBowl.addFood("主人", 1);
}
主人加了1盆猫粮
在主人加了1猫粮后,猫开始吃猫粮了