观察者模式主要就是说观察者与被观察者之间的关系,通常是一个被观察者被多个观察者观察,一对多的关系!
举例:被观察者可以理解为微信,观察者自然就是微信用户。
1>定义被观察者接口:
/**
* 功能描述: 被观察者(微信)
* @date: 2019/7/31
*/
public interface ObserverNo {
/**
* 功能描述: 微信可以添加用户
*/
void addObserver(Observer observer);
/**
* 功能描述: 微信可以删除用户
*/
void delObserver(Observer observer);
/**
* 功能描述: 微信可以群发消息推送
*/
void notifyAllServer(String message);
}
2>定义观察者接口:
/**
* 功能描述: 观察者(微信用户)
* @date: 2019/7/31
*/
public interface Observer {
/**
* 功能描述: 通知
*/
void update(String message);
}
3>定义被观察者实现类--微信:
/**
* 功能描述: 微信
*/
@Data
@Slf4j
public class Wechat implements ObserverNo {
private List<Observer> observers;
private String Message;
public Wechat() {
observers = new ArrayList<>();
}
@Override
public void addObserver(Observer observer) {
observers.add(observer);
}
@Override
public void delObserver(Observer observer) {
log.info("移除一个用户");
observers.remove(observer);
}
@Override
public void notifyAllServer(String message) {
log.info("微信开始推送统一消息");
observers.forEach(observer -> {
observer.update(message);
});
}
}
4>定义观察者实现类--微信用户:
/**
* 功能描述: 微信用户
*/
@Data
@Slf4j
public class WechatUser implements Observer {
private String name;
public WechatUser(String name) {
log.info("微信用户:"+name+" 被创建");
this.name = name;
}
@Override
public void update(String message) {
log.info("微信用户:"+name+" 接收到推送消息:"+message);
}
}
5>测试类:
public class Test {
public static void main(String[] args) {
Wechat server = new Wechat();
Observer userZhang = new WechatUser("张三");
Observer userLi = new WechatUser("李四");
Observer userWang = new WechatUser("王老板");
server.addObserver(userZhang);
server.addObserver(userLi);
server.addObserver(userWang);
server.notifyAllServer("今日毒鸡汤:如果你不努力,就不知道什么叫绝望!");
System.out.println("----------------------------------------------");
server.delObserver(userZhang);
server.notifyAllServer("今日毒鸡汤:比你优秀的人都在努力,那你努力还有什么用呢?");
}
}
测试结果:
09:57:28.180 [main] INFO com.he.hsdyc.designmodule.observer.WechatUser - 微信用户:张三 被创建
09:57:28.180 [main] INFO com.he.hsdyc.designmodule.observer.WechatUser - 微信用户:李四 被创建
09:57:28.180 [main] INFO com.he.hsdyc.designmodule.observer.WechatUser - 微信用户:王老板 被创建
09:57:28.180 [main] INFO com.he.hsdyc.designmodule.observer.Wechat - 微信开始推送统一消息
09:57:28.221 [main] INFO com.he.hsdyc.designmodule.observer.WechatUser - 微信用户:张三 接收到推送消息:今日毒鸡汤:如果你不努力,就不知道什么叫绝望!
09:57:28.221 [main] INFO com.he.hsdyc.designmodule.observer.WechatUser - 微信用户:李四 接收到推送消息:今日毒鸡汤:如果你不努力,就不知道什么叫绝望!
09:57:28.221 [main] INFO com.he.hsdyc.designmodule.observer.WechatUser - 微信用户:王老板 接收到推送消息:今日毒鸡汤:如果你不努力,就不知道什么叫绝望!
----------------------------------------------
09:57:28.222 [main] INFO com.he.hsdyc.designmodule.observer.Wechat - 移除一个用户
09:57:28.222 [main] INFO com.he.hsdyc.designmodule.observer.Wechat - 微信开始推送统一消息
09:57:28.222 [main] INFO com.he.hsdyc.designmodule.observer.WechatUser - 微信用户:李四 接收到推送消息:今日毒鸡汤:比你优秀的人都在努力,那你努力还有什么用呢?
09:57:28.222 [main] INFO com.he.hsdyc.designmodule.observer.WechatUser - 微信用户:王老板 接收到推送消息:今日毒鸡汤:比你优秀的人都在努力,那你努力还有什么用呢?
其实就是一个消息的订阅,微信推送其实就是这个原理,包括一些支付的回调方法啊都是这样!
上面的例子可能不是太通俗,我举个通俗点的例---城管与小贩
在俺们老家小镇有这样一个人,玉树临风,帅的一批,它的职业是城管(被观察者),对他的评价就一个字:优秀的秀!
手底下掌管着五十来号小贩(观察者),有卖手抓饼的,有卖狗不理的,还有波霸奶茶...
大家都偷偷的观察着帅气的城管大大,看到城管大大不经意的嘴角上扬,大家的心里都安定了稍许
我们的城管大大有三大法宝:让你来神水(addObserver),让你滚之剑(delObserver)以及通知大广播(notifyAllServer)!
我们的小贩只有一件生活必备用品:接收广播大耳机(update)
当我们的城管大大开心的时候会赐给新来的小贩“让你来神水”,这就意味着城管大大以后罩着你了,那感觉,不要不要的!(被观察者添加观察者,建立关系)
有一天,卖狗不理的小贩看到帅气的城管大大迎面走来,顿感心花怒放,心想:一定是城管大大看上我了,妈呀,太幸运了!不对啊,差点忘记我是男的,哎,空欢喜一场。这时小贩不知道看到了啥,对着城管大大就是一顿吼:狗,狗,狗
城管大大不屑一顾的瞅了一眼:都结巴了,看到俺这么激动吗?也是,帅也是一种烦恼
突然间,咚的一声,大大掉沟了!小贩赶紧说道:城管大大,不惯我事啊,我刚才都。
大大不紧不慢的起身,拍了拍屁股,对着小贩做了一个嘘的手势:憋说话,吻我,不对,你给我狗带!一把抽出了让你滚之剑
从此小镇,再无狗不理!!!(被观察者移除观察者,解除关系)
片刻后,城管大大掏出了,哦不,拿出了随身的通知大广播,开始了平日的例行鸡汤:大家不要急,你们都还年轻,现在没钱算什么?算什么?以后没钱的日子还多着哩!嘿嘿嘿(被观察者统一推送消息)
与此同时,所有被城管大大罩着的小贩,都通过随身的接收广播大耳机收到了大大的发言,暗叹一声:真有道理哩
而狗不理小贩再也听不到这样的至理名言!!!