观察者模式(Observer Pattern)

23种软件设计模式完整教程

介绍

观察者模式(Observer Pattern)定义了对象之间的一对多依赖,让多个观察者对象同 时监听一个主体对象,当主体对象发生变化时,它的所有依赖者(观察者)都会收到通 知并更新,属于行为型模式。

优点

1、观察者和被观察者之间建立了一个抽象的耦合。

2、观察者模式支持广播通信。

缺点

1、观察者之间有过多的细节依赖、提高时间消耗及程序的复杂度。

2、使用要得当,要避免循环调用。

使用场景

微信朋友圈动态通知、优快云生态圈消息通知、邮件通知、广播通知、桌面程序等

使用建议

观察模式实际开发中使用的较少,一般涉及到观察者的地方都用三方MQ消息组件替代。

具体实现

(实例一)JDK实现:老师监听学生提交作业

类图

代码

package com.knowledge.system.software_design_pattern.observer_pattern.course_instance.jdk;

import lombok.Data;

public class Question {
    private String userName;
    private String content;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}
package com.knowledge.system.software_design_pattern.observer_pattern.course_instance.jdk;

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

public class Teacher implements Observer {
    private String name;

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

    @Override
    public void update(Observable o, Object arg) {
        HomeWork homeWork=(HomeWork)o;
        Question question=(Question)arg;
        System.out.println("++++++++++++消息实时通知++++++++++++++");
        System.out.println(name+"老师,你好\n"+
                "你收到一条来自:"+homeWork.getName()+"  作业提交,提问者:" +question.getUserName()+"问题内容:\n"+
                question.getContent()+"\n"+
                "");
    }
}
package com.knowledge.system.software_design_pattern.observer_pattern.course_instance.jdk;

import java.util.Observable;

public class HomeWork extends Observable {

    private String name="学生作业统一管理平台";

    private static HomeWork homeWork=null;

    private HomeWork(){}

    public static HomeWork getIntance(){
        if(null==homeWork){
            homeWork=new HomeWork();
        }
        return homeWork;
    }

    public String getName() {
        return name;
    }

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

    public void publichQuestion(Question question){
        System.out.println(question.getUserName()+"提了一个问题,内容是:\n"+question.getContent());
        setChanged();
        notifyObservers(question);
    }

}

(实例二)使用guava实现一个简单的观察者

package com.knowledge.system.software_design_pattern.observer_pattern.course_instance.guava;

import com.google.common.eventbus.Subscribe;

public class GuavaEvent {

    @Subscribe
    public void subscribe(String str){
        System.out.println("执行subscribe方法,传入参数是:"+str);
    }
}
package com.knowledge.system.software_design_pattern.observer_pattern.course_instance.guava;

import com.google.common.eventbus.EventBus;

public class Test {
    public static void main(String[] args) {
        EventBus eventBus=new EventBus();
        GuavaEvent guavaEvent=new GuavaEvent();
        eventBus.register(guavaEvent);
        eventBus.post("boubou");
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值