观察者模式

一.观察者模式

观察者模式:对象之间的一对多依赖,让多个观察者对象同时监听一个主体对象,当主体对象发生变化时,观察者对象收到通知并更新

二.观察者模式-示例朋友圈关注-JDK实现

当我们设置关注某一个人时,ta的朋友圈更新,我们也会收到消息提醒

1.新建一个朋友圈消息类

// 朋友圈消息
public class WechatMessage {

    // 发朋友圈的名字
    private String name;

    // 发朋友圈的内容
    private String content;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getContent() {
        return content;
    }

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

2.新建一个WeChat类继承Observable (jdk中的类用于实现观察者模式,其作用为注册观察者,唤醒观察者)

public class WeChat extends Observable {

    private String name = "朋友圈";

    private static WeChat weChat = new WeChat();

    private WeChat(){}

    public static WeChat getInstance(){
        return  weChat;
    }

    public void publishMsg(WechatMessage wechatMessage){

        System.out.println(wechatMessage.getName()+"在"+this.name+"发布了一条朋友圈...");
        // 标记被观察者的改变
        setChanged();
        // 通知观察者,传入消息内容
        notifyObservers(wechatMessage);
    }

}

3.新建一个Watcher类实现Observer接口(jdk中,其作用为:当通知观察者时,观察者需要做的更新操作是什么)

public class Watcher implements Observer {

    private String name;

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

    // 接受到消息通知内容
    @Override
    public void update(Observable o, Object arg) {
        // 被观察者
        WeChat weChat = (WeChat) o;
        // notifyObservers(wechatMessage) 中所传入的参数
        WechatMessage wechatMessage = (WechatMessage) arg;
        // 观察者,根据被观察者的状态做出相应的改变
        System.out.println("=======================================");
        System.out.println(this.name + ",你关注的" + wechatMessage.getName() + "发布了一条朋友圈,内容为:" + wechatMessage.getContent() + "-赶紧过去点赞!");

    }
}

4.新建一测试类

public class Test {
    public static void main(String[] args) {
        WeChat weChat = WeChat.getInstance();
        // 设置被观察对象小红发朋友圈
        WechatMessage wechatMessage = new WechatMessage();
        wechatMessage.setName("小红");
        wechatMessage.setContent("哦,这该死的天气!");
        // 观察者-小明
        Watcher watcher = new Watcher("小明");
        // 观察者-小王
        Watcher watcher1 = new Watcher("小明");
        // 加入观察者
        weChat.addObserver(watcher);
        weChat.addObserver(watcher1);
        // 被观察对象发布朋友圈
        weChat.publishMsg(wechatMessage);
    }
}

5.测试结果

6.UML图

 

三.Guava实现事件监听

1.创建事件源,添加注解

public class GuavaEvent {

    @Subscribe
    public void subscribe(String msg){
        System.out.println("发起调用:"+msg);
    }
}

2.新建测试类-先创建事件总线,将事件注册到事件总线中,当发起调用时,会通知到注册到事件总线中的事件,完成调用

public class GTest {
    public static void main(String[] args) {
        // 事件总线
        EventBus eventBus = new EventBus();
        // 新建事件
        GuavaEvent guavaEvent = new GuavaEvent();
        // 注册事件
        eventBus.register(guavaEvent);
        // 发起调用
        eventBus.post("message");
    }
}

3.测试结果

四.观察者模式-示例朋友圈关注-Guava实现

1.新建一朋友圈消息类

// 朋友圈消息
public class WechatMessage {

    // 发朋友圈的名字
    private String name;

    // 发朋友圈的内容
    private String content;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getContent() {
        return content;
    }

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

2.新建一WeChat继承EventBus

public class WeChat extends EventBus {

    private String name = "朋友圈";

    private static WeChat weChat = new WeChat();

    private WeChat(){}

    public static WeChat getInstance(){
        return  weChat;
    }

    public void publishMsg(WechatMessage wechatMessage){

        System.out.println(wechatMessage.getName()+"在"+this.name+"发布了一条朋友圈...");

        // 触发事件
        this.post(wechatMessage);
    }

}

3.新建一Watcher--只需要在事件被触发时,所回调的方法上加注解@Subscribe

public class Watcher {

    private String name;

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

    @Subscribe
    public void watcherWechat(WechatMessage wechatMessage){
        // 观察者,根据被观察者的状态做出相应的改变
        System.out.println("=======================================");
        System.out.println(this.name + ",你关注的" + wechatMessage.getName() + "发布了一条朋友圈,内容为:" + wechatMessage.getContent() + "-赶紧过去点赞!");

    }
}

 4.新建一测试类

public class Test {
    public static void main(String[] args) {

        WeChat eventBus = WeChat.getInstance();
        Watcher guavaEvent = new Watcher("小明");
        Watcher guavaEvent1 = new Watcher("小王");
        // 注册事件
        eventBus.register(guavaEvent);
        eventBus.register(guavaEvent1);
        WechatMessage wechatMessage = new WechatMessage();
        wechatMessage.setName("小红");
        wechatMessage.setContent("啊,这天气好热!");
        // 发起事件
        eventBus.publishMsg(wechatMessage);
    }
}

5.测试结果

6.UML图

五.总结

观察者模式:流程为:新建事件->注册事件->新建消息->发起事件

通过传入的消息,去更新事件,当有多个对象去监听同一个消息时,那么多个监听对象会同步更新

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值