设计模式之观察者模式
定义: 多个对象间存在一对多关系,当一个对象发生改变时,会把这种改变通知给其他多个对象,从而影响其他对象的行为。
首先提取关键词,多个对象、一对多关系,通知其他对象。
根据上述关键词定义一个多的对象(SmsTarget),定义一个改变的量(SmsPool.smsContent),再定义通知方法notifyObserver()。
/**
* @author lw
* @date 2022/3/31 0031
* @description 短信池
*/
public class SmsPool {
//观察者
List<SmsTarget> targets = new ArrayList<>();
String smsContent = "";
public void addObserver(SmsTarget target){
this.targets.add(target);
}
public void delObserver(SmsTarget target){
for (SmsTarget smsTarget : this.targets) {
if(target.phone.equals(smsTarget.phone)){
this.targets.add(target);
}
}
}
public void notifyObserver(){
SmsService smsService = new SmsService();
for (SmsTarget target : this.targets) {
smsService.send(target,this.smsContent);
}
}
}
如上所示,观察者添加到List中,当smsContent发生变化时,群发短信给这些目标人群。
调用者
SmsTarget target01 = new SmsTarget("18751837711");
SmsTarget target02 = new SmsTarget("18751837722");
SmsPool smsPool = new SmsPool();
smsPool.addObserver(target01);
smsPool.addObserver(target02);
smsPool.smsContent = "hello world";
smsPool.notifyObserver();
其实可以假想一下thread.wait()和thread.notify()方法。
thread-00~02都在等待thread-03释放CPU,全部都在看CPU状态。
当thread-03执行完毕,释放了CPU后,调用notify()方法,此时通知所有等待的线程开始争夺CPU。