「java订阅模式」什么叫订阅模式

博主:adminadmin 2022-12-27 01:57:08 62

本篇文章给大家谈谈java订阅模式,以及什么叫订阅模式对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

设计模式-快餐简解-【观察者模式】

【 观察者模式应用场景举例 】

比如在玩 极品飞车 这款游戏 每一个车手到达终点的时候 都会在其它车手的屏幕上显示 某某人以多少时间到达终点的提示 其实这就是一个典型的观察者模式的应用 观察者模式即是典型的双向一对多的应用场景下用一的一端来通知多的一端

【 观察者 模式解释】

类型 行为模式

定义了一种一对多的依赖关系 让多个观察者对象同时监听某一个主题对象 这个主题对象的状态发生改变时 会通知所有的观察者对象 使它们能够自己更新自己

【 观察者 模式UML图】

【 观察者 模式 JAVA代码实现】

新建抽象发布通知父类

package carer_subject;import java util ArrayList;import java util List;import carer_observer carer_observer;public interface carer_subject_parent {    public void set_state(String state_string);    public String get_state();    public void add_observer(carer_observer carer_observer_ref);    public void sub_observer(carer_observer carer_observer_ref);    public void notityAllCarer();}

新建发布通知实现类

package carer_subject;import java util ArrayList;import java util List;import carer_observer carer_observer;public class carer_subject_sub implements carer_subject_parent {    Listcarer_observer list_observer = new ArrayListcarer_observer();    private String state;    public void set_state(String state_string) {        this state = state_string;    }    public String get_state() {        return state;    }    public void add_observer(carer_observer carer_observer_ref) {        list_observer add(carer_observer_ref);    }    public void sub_observer(carer_observer carer_observer_ref) {        list_observer remove(carer_observer_ref);    }    public void notityAllCarer() {        state =  到达终点 ;        for (int i =  ; i  list_observer size(); i++) {            list_observer get(i) show_info();        }    }}

新建观察者接口

package carer_observer;import carer_subject carer_subject_parent;public interface carer_observer {    public void show_info();}

新建观察者实现类

package carer_observer;import carer_subject carer_subject_parent;public class carer_observer_imple implements carer_observer {    private carer_subject_parent carer_subject_parent_ref;    public carer_subject_parent getCarer_subject_parent_ref() {        return carer_subject_parent_ref;    }    public void setCarer_subject_parent_ref(            carer_subject_parent carer_subject_parent_ref) {        this carer_subject_parent_ref = carer_subject_parent_ref;    }    public carer_observer_imple(carer_subject_parent carer_subject_parent_ref) {        super();        this carer_subject_parent_ref = carer_subject_parent_ref;    }    public void show_info() {        System out println(carer_subject_parent_ref get_state());    }}

新建客户端运行类

package run_main;import carer_observer carer_observer_imple;import carer_subject carer_subject_parent;import carer_subject carer_subject_sub;public class run_main {    public static void main(String[] args) {        carer_subject_parent carer_subject_parent_ref = new carer_subject_sub();        carer_observer_imple carer_observer_imple_ref  = new carer_observer_imple(                carer_subject_parent_ref);        carer_observer_imple carer_observer_imple_ref  = new carer_observer_imple(                carer_subject_parent_ref);        carer_observer_imple carer_observer_imple_ref  = new carer_observer_imple(                carer_subject_parent_ref);        carer_observer_imple carer_observer_imple_ref  = new carer_observer_imple(                carer_subject_parent_ref);        carer_subject_parent_ref add_observer(carer_observer_imple_ref );        carer_subject_parent_ref add_observer(carer_observer_imple_ref );        carer_subject_parent_ref add_observer(carer_observer_imple_ref );        carer_subject_parent_ref add_observer(carer_observer_imple_ref );        carer_subject_parent_ref sub_observer(carer_observer_imple_ref );        carer_subject_parent_ref set_state( 到达终点 );        carer_subject_parent_ref notityAllCarer();    }}

程序运行结果如下

到达终点到达终点到达终点

以一对多的方式进行对一方状态的改变而去通知多方 观察者模式也叫发布/订阅模式 一方进行发布 而多方进行订阅 和生活中看报纸一样 你喜欢订城市晚报 就会发给你

【 观察者 模式 MyEclipse 项目JAVA代码实现】

lishixinzhi/Article/program/Java/gj/201311/27277

观察者模式(Observer Pattern)

观察者模式又称为发布订阅模式。一个发布者对应多个订阅者,一旦发布者的状态发生改变时,订阅者将收到订阅事件。

先看看一个生活中的例子:

我们使用想浏览Java相关的文章,于是我们点击订阅了[Java专题],当[Java专题]有新文章发布就会推送给我们,当然其他人也可以订阅[Java专题]并收到[Java专题]的推送。这就是观察者。 定义对象间的一对多关系,当一个对象的状态发生变化时,所依赖于它的对象都得到通知并主动更新。在观察者模式中,多个订阅者成为观察者(Observer),被观察的对象成为目标(Subject)。

实现观察者模式的方法不只一种,但是以包含Subject与Observer接口的类设计的做法最常见。(Java API 内置观察者模式用的是Observer接口与Observable类)

观察者模式UML图:

先定义观察者模式的接口

在观察者模式的实现上,有推模式和拉模式两种方式。

上面例子中

void updateByPush(Object obj) 就是推模式;

void updateByPull(Subject subject)就是拉模式

java.util包内包含最基本的Observer接口与Observable类(其实对应的就是Subject类)

我们看一下Observer源码

我们看到update更新方法有两个参数:Observable、Object,可见Java API 内置观察者模式同时支持[拉]和[取]

我们再来看看Observable类源码

注意Observable是一个类,而不是接口,这有一定的局限性。因为如果某个类想同时具有Observable类和另一个超类的行为,就会陷入两难,毕竟Java不支持多重继承。

有点需要特别提一下的就是,Java API 内置的Observable需要调用一下 setChanged();观察者才能收到推送,我们看一下源码,发现notifyObservers方法里有判断changed的状态为true才去通知观察者。

我们自己实现观察者模式的时候是没有这一点的,那加上这一个标志位有什么好处?好处就是更灵活,Observable类只提供这个boolean值来表明是否发生变化,而不定义什么叫变化,因为每个业务中对变化的具体定义不一样,因此子类自己来判断是否变化;该变量既提供了一种抽象(变与不变),同时提供了一种观察者更新状态的可延迟加载,通过后面的notifyObservers方法分析可知观察者是否会调用update方法,依赖于changed变量,因此即使被观察者在逻辑上发生改变了,只要不调用setChanged,update是不会被调用的。如果我们在某些业务场景不需要频繁触发update,则可以适时调用setChanged方法来延迟刷新。

阿里云折扣快速入口

java 设计模式之 观察者模式(Observer)

//Subject java

package youngmaster model Observer;

/**

* @author youngmaster

* @E mail:young * @version myEclipse

* @create time 上午 : :

*/

/**

* 察者模式属于行为型模式 其意图是定义对象间的一种一对多的依赖关系

* 当一个对象的状态发生改变时 所有依赖于它的对象都得到通知并被自动更新

* 在制作系统的过程中 将一个系统分割成一系列相互协作的类有一个常见的副作用

* 需要维护相关对象间的一致性 我们不希望为了维持一致性而使各类紧密耦合

* 因为这样降低了他们的可充用性 这一个模式的关键对象是目标(Subject)和观察者(Observer)

* 一个目标可以有任意数目的依赖它的观察者 一旦目标的状态发生改变 所有的观察者都得到通知

* 作为对这个通知的响应 每个观察者都将查询目标以使其状态与目标的状态同步 这种交互也称为发布 订阅模式

* 目标是通知的发布者 他发出通知时并不需要知道谁是他的观察者 可以有任意数据的观察者订阅并接收通知

*/

/**

* subject

*目标接口

*/

public interface Subject {

public void addObserver(Observer o);

public void deletObserver(Observer o);

public void notice();

}

//Observer java

package youngmaster model Observer;

/**

* @author youngmaster

* @E mail:young * @version myEclipse

* @create time 上午 : :

*/

/**

*观察者接口

*/

public interface Observer {

public void update();

}

//Teacher java

package youngmaster model Observer;

import java util Vector;

/**

* @author youngmaster

* @E mail:young * @version myEclipse

* @create time 上午 : :

*/

/**

*目标接口实现

*/

public class Teacher implements Subject {

private String phone;

@SuppressWarnings( unchecked )

private Vector students;

@SuppressWarnings( unchecked )

public Teacher() {

phone = ;

students = new Vector();

}

@SuppressWarnings( unchecked )

@Override

public void addObserver(Observer o) {

students add(o);

}

@Override

public void deletObserver(Observer o) {

students remove(o);

}

@Override

public void notice() {

for (int i = ; i students size(); i++) { ((Observer) students get(i)) update();

}

}

public void setPhone(String phone) {

this phone = phone;

notice();

}

public String getPhone() {

return phone;

}

}

//Student java

package youngmaster model Observer;

/**

* @author youngmaster

* @E mail:young * @version myEclipse

* @create time 上午 : :

*/

/**

*观察者接口实现

*/

public class Student implements Observer {

private String name;

private String phone;

private Teacher teacher;

public Student(String name Teacher teacher) { this name = name; this teacher = teacher;

}

public void show() {

System out println( Name: + name + \nTeacher s phone: + phone);

}

@Override

public void update() {

phone = teacher getPhone();

}

}

//Client java

package youngmaster model Observer;

import java util Vector;

/**

* @author youngmaster

* @E mail:young * @version myEclipse

* @create time 上午 : :

*/

/**

*测试类

*/

public class Client {

/**

* @param args

*/

@SuppressWarnings( unchecked )

public static void main(String[] args) {

Vector students = new Vector();

Teacher teacher = new Teacher();

for (int i = ; i ; i++) {

Student student = new Student( student + i teacher); students add(student); teacher addObserver(student);

}

teacher setPhone( );

for (int i = ; i ; i++)

((Student) students get(i)) show();

System out println( \n============================\n );

teacher setPhone( );

for (int i = ; i ; i++)

((Student) students get(i)) show();

}

lishixinzhi/Article/program/Java/gj/201311/27566

Spring ApplicationContext事件机制

ApplicationContext中事件处理是由ApplicationEvent类和ApplicationListener接口来提供的。如果一个Bean实现了ApplicationListener接口,并且已经发布到容器中去,每次ApplicationContext发布一个ApplicationEvent事件,这个Bean就会接到通知。Spring事件机制是观察者模式的实现。

ApplicationEvent,容器事件,必须被ApplicationContext发布。

ApplicationListener,监听器,可由容器中任何监听器Bean担任。

实现了ApplicationListener接口之后,需要实现方法onApplicationEvent(),在容器将所有的Bean都初始化完成之后,就会执行该方法。

观察者模式,Observer Pattern也叫作发布订阅模式Publish/Subscribe。定义对象间一对多的依赖关系,使得每当一个对象改变状态,则所有依赖与它的对象都会得到通知,并被自动更新。

观察者模式的几角色名称:

观察者模式需要考虑开发效率和运行效率问题,一个被观察者,多个观察者,开发和调试比较复杂,Java消息的通知默认是顺序执行的,一个观察者卡壳,会影响整体的执行效率。这种情况一般考虑异步的方式。

java.util.Observable类和java.util.Observer接口。

观察者模式也叫作发布/订阅模式。

Spring在事件处理机制中使用了观察者模式:

AbstractApplicationContext类中publishEvent方法实现:

ApplicationEventMulticaster的multicastEvent方法的实现在SimpleApplicationEventMulticaster类中:

这就执行了了onApplicationEvent方法,这里是事件发生的地方。

在Spring容器初始化的时候,也就是在refresh方法中:

initApplicationEventMulticaster方法初始化事件注册表:

在AbstractApplicationEventMulticaster类中有如下属性:

ListenerRetriever的结构如下:

初始化注册表之后,就会把事件注册到注册表中,registerListeners():

Spring使用反射机制,通过方法getBeansOfType获取所有继承了ApplicationListener接口的监听器,然后把监听器放到注册表中,所以我们可以在Spring配置文件中配置自定义监听器,在Spring初始化的时候,会把监听器自动注册到注册表中去。

ApplicationContext发布事件可以参考上面的内容。发布事件的时候的一个方法,getApplicationListeners:

根据事件类型,事件源类型获取所需要的监听器supportsEvent(listener, eventType, sourceType):

这里没有进行实际的处理,实际处理在smartListener.supportsEventType(eventType)和smartListener.supportsSourceType(sourceType)方法中。

smartListener.supportsEventType(eventType):

该方法主要的逻辑就是根据事件类型判断是否和监听器参数泛型的类型是否一致。

smartListener.supportsSourceType(sourceType)方法的实现为:

定义自己的监听器要明确指定参数泛型,表明该监听器支持的事件,如果不指明具体的泛型,则没有监听器监听事件。

暂先不做解析。

java一共有多少种模式,分别是啥啊?谢谢大家帮忙

转载//////////////

Java中的23种设计模式:

Factory(工厂模式), Builder(建造模式), Factory Method(工厂方法模式),

Prototype(原始模型模式),Singleton(单例模式), Facade(门面模式),

Adapter(适配器模式), Bridge(桥梁模式), Composite(合成模式),

Decorator(装饰模式), Flyweight(享元模式), Proxy(代理模式),

Command(命令模式), Interpreter(解释器模式), Visitor(访问者模式),

Iterator(迭代子模式), Mediator(调停者模式), Memento(备忘录模式),

Observer(观察者模式), State(状态模式), Strategy(策略模式),

Template Method(模板方法模式), Chain Of Responsibleity(责任链模式)

工厂模式:工厂模式是一种经常被使用到的模式,根据工厂模式实现的类可以根据提供的数据生成一组类中某一个类的实例,通常这一组类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作.首先需要定义一个基类,该类的子类通过不同的方法实现了基类中的方法.然后需要定义一个工厂类,工厂类可以根据条件生成不同的子类实例.当得到子类的实例后,开发人员可以调用基类中的方法而不必考虑到底返回的是哪一个子类的实例.

java中什么叫"观察者设计模式"?

观察者模式(Observer Pattern),又被称为发布/订阅模式,它是软体设计模式中的一种。观察者模式定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

在观察者模式中,一个目标物件(被观察者)管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知,这通常通过呼叫各观察者所提供的方法来实现。此种模式通常被用来实作事件处理系统。观察者模式有很多实现方式,从根本上说,该模式必须包含两个角色:观察者和被观察者。观察者和被观察对象之间的互动关系不能体现成类之间的直接调用,那样就将使观察者和被观察对象之间紧密的耦合起来,从根本上违反面向对象的设计的原则。在具体的实现中,我们需要面向接口编程,让被观察者管理观察者对象接口类型,然后调用接口方法更新观察者。

详细内容请参考《软件秘笈:设计模式那点事》,祝你早日学会设计模式!

java订阅模式的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于什么叫订阅模式、java订阅模式的信息别忘了在本站进行查找喔。

The End

发布于:2022-12-27,除非注明,否则均为首码项目网原创文章,转载请注明出处。