消费者模式 java 设计模式_Java设计模式之观察者模式(生产者与消费者模式)

本文介绍了Java设计模式中的观察者模式,通过生活中的例子,如商场会员推送和天气预报,阐述了一对多的依赖关系。文章详细展示了如何创建抽象观察者、主题、具体主题和具体观察者的类,并通过一个主测试类运行示例,展示当主题状态改变时,所有订阅者将自动接收并更新信息。
摘要由CSDN通过智能技术生成

生活中我们经常遇到观察者模式的案例。

例如,我们去商场购物,注册了一家店的会员,一旦这家店有活动,你的手机就会收到一些推送消息,是不是?

在例如,我们看某个电视台的节目,这个电视台放什么节目我们就会看到什么节目。

这些都是典型的生产者与消费者的案例。

所谓的观察者模式,定义了一种一对多的依赖关系,能够让多个观察者订阅某个主题,当这个主题发生变化的时候,主题会通知这些订阅者,那么观察者就会自动更新变化。

我们以天气预告为例,tom和jack,都订阅了手机天气预告功能,那么天气预告会每天进行通知tom和jack,tom和jack就会收到天气预报,一旦天气预报发生变化,tom和jack也会收到这些通知。

下面看具体实现。

//===========Observer.java===============

//抽象类,观察者,具体的观察这将到子类实现

public abstract class Observer {

public abstract void update();

}

//===========Subject.java===============

//主题

public class Subject {

//保存多个观察者(就是订阅该主题的人)

private List observers=new ArrayList();

/**

* 增加观察者

* @param observer

*/

public void addObserver(Observer observer){

observers.add(observer);

}

/**

* 移除观察者

* @param observer

*/

public void removeObserver(Observer observer){

observers.remove(observer);

}

/**

* 通知观察者

*/

public void notifyObserver(){

for (Observer observer : observers) {

observer.update();

}

}

}

//===========ConcreteSubject.java===============

//具体的某个主题

public class ConcreteSubject extends Subject {

//主题消息内容

private String subjectState;

public String getSubjectState() {

return subjectState;

}

public void setSubjectState(String subjectState) {

this.subjectState = subjectState;

}

}

//===========ConcreteObserver.java===============

//具体的某个观察者

public class ConcreteObserver extends Observer {

private String name;

private String observerState;

private ConcreteSubject subject;

public ConcreteObserver(ConcreteSubject subject,String name){

this.subject=subject;

this.name=name;

}

@Override

public void update() {

observerState=subject.getSubjectState();

System.out.println(String.format("%s的收到消息,内容是:%s", name,observerState));

}

}

//===========MainTest.java===============

public static void main(String[] args) {

//主题

ConcreteSubject subject=new ConcreteSubject();

//tom订阅主题

subject.addObserver(new ConcreteObserver(subject, "tom"));

//jack订阅主题

subject.addObserver(new ConcreteObserver(subject, "jack"));

//编写主题内容

subject.setSubjectState("今天下雨");

//发布主题,所有订阅主题的人都收到了

subject.notifyObserver();

//编写主题内容

subject.setSubjectState("根据最新气象显示,今天大部分地区将是雨转多云");

//发布主题,所有订阅主题的人都收到了

subject.notifyObserver();

}

我们看结果:

tom的收到消息,内容是:今天下雨

jack的收到消息,内容是:今天下雨

tom的收到消息,内容是:根据最新气象显示,今天大部分地区将是雨转多云

jack的收到消息,内容是:根据最新气象显示,今天大部分地区将是雨转多云

easy吧,完!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值