观察者模式(Observer)
一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知,进行广播通知。就可以使用观察者模式,当少的一方状态发生改变时会自动通知所有依赖它的对象并自动更新。
Java已经提供了观察者模式的默认支持,Observable类 和 Observer接口。
目标对象需要继承Observable类,目标对象代码如下:
public class Food extends Observable {// 菜名
private String name;
// 价格
private float price;
public Food(String name, float price) {
this.name = name;
this.price = price;
}public String getName() {
return name;
}public void setName(String name) {
this.name = name;
}public float getPrice() {
return price;
}public void setPrice(float price) {
this.price = price;
// 价格发生改变
this.setChanged();
// 商贩一旦改变菜价,便会通知所有顾客(回调Observer的update方法进行更新)
this.notifyObservers(price);
}
}
观察者,需要实现Observer接口,并且重写update方法,update方法写根据实际情况写业务逻辑。
/**
* 顾客
*
*/
public class Customer implements Observer{private String name;
public Customer(String name) {
this.name = name;
}public String getName() {
return this.name;
}// 目标对象状态一旦发生改变,便会执行此方法
@Override
public void update(Observable o, Object arg) {
if (o instanceof Food && arg instanceof Float) {
Food food = (Food) o;
float price = (Float) arg;
System.out.printf("您好: %s, %s的价格已经发生改变,现在的价格为:%.2f 元/斤\n", this.name, food.getName(), price);
}
}
}
【观察者模式(Observer)】测试,观察者想要接到通知,还需要在目标对象调用
addObserver(Object obj)
方法注册public class TestMain {@Test
public void test() {
// 商品
Food food = new Food("土豆", 11.5f);
// 顾客
Customer lisi = new Customer("李四");
Customer wangwu = new Customer("王五");
// 添加需要通知顾客
food.addObserver(lisi);
food.addObserver(wangwu);
// 更新价格
food.setPrice(100.0f);
}
}
推荐阅读
- --木木--|--木木-- 第二课作业#翼丰会(每日一淘6+1实战裂变被动引流# 6+1模式)
- 设计模式-代理模式-Proxy
- 【译】Rails|【译】Rails 5.0正式发布(Action Cable,API模式等)
- java静态代理模式
- VueX(Vuex|VueX(Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式)
- Kotlin基础(10)-代理模式在kotlin中的使用
- 长谈的确是这个时代需要的一种模式
- 《读_Head_First_有感》_“命令模式”
- 洗洗睡了|洗洗睡了 | 休息的时候,千万注意切换你的行为模式
- 设计模式【15】--从审批流中学习责任链模式