结合JDK中的API落地观察者模式

观察者模式定义了对象之间的一对多依赖,让多个观察者对象同时监听一个主体对象,当主体对象发生变化时,它的所有依赖者(观察者)都会收到通知并更新,属于行为型模式。观察者模式有时也叫做发布订阅模式。观察者模式主要用于在关联行为之间建立一套触发机制的场景。观察者模式在现实生活应用非常广泛,比如:微信朋友圈动态通知,邮件通知,广播通知。
下面以JDK中相关的API来演示:
朋友圈类(被观察者):

package observer;

import java.util.Observable;

/**
 * JDK提供的一种观察者的实现方式,被观察者
 * Created by Lenovo on 2019-7-20.
 */
public class WxFriends extends Observable {
    private String name="微信朋友圈";
    private static WxFriends wxFriends=null;
    private WxFriends(){}
    public static WxFriends getInstance(){
        if(null==wxFriends){
            wxFriends=new WxFriends();
        }
        return  wxFriends;
    }
    public String getName(){
        return name;
    }
    public void publishSomethings(Somethings somethings){
        System.out.println(somethings.getUsername()+"在"+this.name+"发了一个动态");
        setChanged();
        notifyObservers(somethings);
    }
}

朋友圈动态类:

package observer;

/**
 * Created by Lenovo on 2019-7-20.
 */
public class Somethings {
    private String username;
    private String content;

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
}

用户类(观察者)

package observer;

import java.util.Observable;
import java.util.Observer;

/**观察者
 * Created by Lenovo on 2019-7-20.
 */
public class User implements Observer{
    private String name;

    public User(String name) {
        this.name = name;
    }

    @Override
    public void update(Observable o, Object arg) {
        WxFriends wxFriends=(WxFriends) o;
        Somethings somethings=(Somethings) arg;
        System.out.println("===========================");
        System.out.println(name+"用户,你好\n"+"您收到一个来自"+wxFriends.getName()+"动态,内容如下:"+somethings.getContent()
        +"来自于--------"+somethings.getUsername());
    }
}

测试类:

package observer;

/**
 * Created by Lenovo on 2019-7-20.
 */
public class ObserverTest {
    public static void main(String[] args){
        WxFriends wxFriends=WxFriends.getInstance();
        User user=new User("阿浩");
        wxFriends.addObserver(user);

        Somethings somethings=new Somethings();
        somethings.setUsername("James");
        somethings.setContent("万物皆对象");
        wxFriends.publishSomethings(somethings);
    }
}

结果:
在这里插入图片描述
观察者的优点:
1.观察者和被观察者之间建立了一个抽象的耦合。
2.观察者模式支持广播通信。
缺点:
1.观察者之间有过多的细节依赖,提高时间消耗以及程序的复杂度。
2.使用要得当,要避免循环调用。

注:另外有利用guava实现的微信朋友圈,代码见:https://gitee.com/zhujunhao19960225/guanchazhemoshiguava.git

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值