微信发个朋友圈没有想到也可以用设计模式来实现——观察者模式

来源:互联网 发布:iphone8怎么卸载软件 编辑:程序博客网 时间:2024/06/13 19:02

观察者模式的概念

        观察者模式(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;}//发朋友圈@Overridepublic void sendFriendBlock(String msg, WeChatSubject wcs) {String str = this.name+"发了一条朋友圈,内容是:" + msg+".";System.out.println("我发了一条朋友圈!");wcs.notifyAllFriend(str, this.name);}//接收朋友圈消息@Overridepublic 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 {@Overridepublic 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/