观察者模式的概念
观察者模式(Observer Pattern):定义对象之间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式的别名包括发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。观察者模式是一种对象行为型模式。
当某个状态的改变,那与之相关的对象就会收到这个改变的通知。就好比你在微信发一条朋友圈消息,那么你的所有好友都会在他的微信上收到有一条新的朋友圈消息的提示一样。你在微信发了一条朋友圈消息可以理解成状态被改变了,这个状态的改变就要通知你的好友你改变了一个状态,而这个状态就是你发了一条朋友圈消息,那么你的好友就能查看到你最新发的的朋友圈消息了。
在微信上可以关注牛人们的公众号,当公众号发了一篇新的文章的时候,所有关注此公众号的微信用户都会收到一条有最新订阅号的小红点通知。这种类型的事例很多,前人大神们把这种模式或者模型总结起来就成了观察者设计模式。这是一种通用的经验知识,用来解决相同类型问题的方法。学习技术不能只看,不动手实践,否则白看了。
发朋友圈所有好友都收到有最新消息这个过程,我们先找出观察目标(Subject)和观察者(Observer),观察目标它是一个状态改变者,就是因为它得状态改变了才需要通知观察者。这里很显然发朋友圈这个人是观察目标,他得好友是观察者。下面用观察者设计模式来实现发朋友圈的这个一个功能。
//观察者接口
public interface WeChatObserver {
//发送朋友圈方法
public void sendFriendBlock(String msg, WeChatSubject wcs);
//接收最新朋友圈消息
public void receiveFriendBlockMsg(String msg);
}
//具体实现观察者类(微信用户)
public class ConWeChatObserver implements WeChatObserver {
//名字
private final String name;
public ConWeChatObserver(String name) {
this.name = name;
}
//发朋友圈
@Override
public void sendFriendBlock(String msg, WeChatSubject wcs) {
String str = this.name+"发了一条朋友圈,内容是:" + msg+".";
System.out.println("我发了一条朋友圈!");
wcs.notifyAllFriend(str, this.name);
}
//接收朋友圈消息
@Override
public void receiveFriendBlockMsg(String msg) {
System.out.println("---------------------------------------");
System.out.println(this.name + "收到一条新得朋友圈消息!");
System.out.println(msg);
}
public String getName() {
return this.name;
}
}
import java.util.ArrayList;
import java.util.List;
//观察目标
public abstract class WeChatSubject {
//观察者也就是微信好友
protected List<WeChatObserver> obsArray = new ArrayList<WeChatObserver>();
//添加微信好友
public void addFriend(WeChatObserver obs){
this.obsArray.add(obs);
}
//向朋友推送一条朋友圈消息
public abstract void notifyAllFriend(String msg, String name);
}
//具体实现观察目标得类
public class ConWeChatSubject extends WeChatSubject {
@Override
public void notifyAllFriend(String msg, String name) {
//通知好友,有最新朋友圈消息
for(WeChatObserver obs : this.obsArray){
obs.receiveFriendBlockMsg(msg);
}
}
}
//测试类
public class WeChatTestClient {
public static void main(String[] args) {
//观察目标对象
WeChatSubject wcs = new ConWeChatSubject();
//观察者
WeChatObserver user1 = new ConWeChatObserver("牛顿");
WeChatObserver user2 = new ConWeChatObserver("霍金");
WeChatObserver user3 = new ConWeChatObserver("伽利略");
WeChatObserver user4 = new ConWeChatObserver("爱恩斯坦");
//牛顿同学得微信好友有霍金、伽利略、爱恩斯坦
wcs.addFriend(user2);
wcs.addFriend(user3);
wcs.addFriend(user4);
//牛顿发个朋友圈
user1.sendFriendBlock("我今天很开心,因为炒股小赚了一笔!", wcs);
System.out.println("------------------------------------------");
//发朋友圈----->通知所有好友---->好友接收最新朋友圈消息
}
}
我觉得设计模式学习了就要去实践或者应用到项目中去,只有多用了才能更好理解它的思想,才能写出更加好得代码。
参考:https://gof.quanke.name/