写在前面
本文一起看下一种行为型设计模式,观察者模式。
1:介绍
1.1:什么时候使用观察者设计模式
pub,sub场景。
1.2:UML类图
观察者设计模式,包含如下元素:
1:Observer
定义了如何接受通知的方法
2:ConcreteObserver
具体的Observer,具体处理通知
2:Subject
被观察者,维护Observer集合,以及通知方法
3:ConcreteSubject
具体的Subject实现类,在通知方法中通知维护的Observer集合
2:实例
源码 。
2.1:场景
大爷,大妈们等着抢购超时的搞活动商品,一旦有活动通知就过去了,哈哈哈!!!
2.2:程序
- 老人Observer
// 老人观察者类
public interface OldPeopleObserver {
// 老人行动了,要去超市抢购productName了
void action(String productName);
}
- 王大爷和李大妈Observer
// 王大爷具体类
public class WangDaYeObserver implements OldPeopleObserver {
@Override
public void action(String productName) {
System.out.println("王大爷抢购:" + productName);
}
}
// 李大妈观察者具体类
public class LiDaMaObserver implements OldPeopleObserver {
@Override
public void action(String productName) {
System.out.println("李大妈抢购:" + productName);
}
}
- 超市Subject接口
public interface SuperMarketSubject {
// 添加老人观察这类
void addOldPeopleObserver(OldPeopleObserver oldPeopleObserver);
// 删除老人观察这类
void removeOldPeopleObserver(OldPeopleObserver oldPeopleObserver);
// 发布商品抢购的事件,通知老人观察者
void notify(String productName);
}
- 物美超市具体Subject类
// 物美超市主题类
// 如果是有其它超市的话,可以类比实现
public class WuMeiSubject implements SuperMarketSubject {
private List<OldPeopleObserver> oldPeopleObservers = new ArrayList<>();
@Override
public void addOldPeopleObserver(OldPeopleObserver oldPeopleObserver) {
oldPeopleObservers.add(oldPeopleObserver);
}
@Override
public void removeOldPeopleObserver(OldPeopleObserver oldPeopleObserver) {
oldPeopleObservers.remove(oldPeopleObserver);
}
@Override
public void notify(String productName) {
oldPeopleObservers.forEach(oldPeopleObserver -> oldPeopleObserver.action(productName));
}
}
- 客户端类
public static void main(String[] args) {
// 创建主题类
SuperMarketSubject subject = new WuMeiSubject();
// 创建李大妈观察者类
LiDaMaObserver liDaMaObserver = new LiDaMaObserver();
// 创建王大爷观察者类
WangDaYeObserver wangDaYeObserver = new WangDaYeObserver();
// 将李大妈和王大爷添加到物美主体类中,等待接受来自物美超市的优惠活动
subject.addOldPeopleObserver(liDaMaObserver);
subject.addOldPeopleObserver(wangDaYeObserver);
System.out.println("----------西瓜搞活动----------");
subject.notify("西瓜");
System.out.println("----------香菜搞活动----------");
subject.notify("香菜");
}
运行:
----------西瓜搞活动----------
李大妈抢购:西瓜
王大爷抢购:西瓜
----------香菜搞活动----------
李大妈抢购:香菜
王大爷抢购:香菜
写在后面
参考文章列表
秒懂设计模式之观察者模式(Observer Pattern) 。