您的位置:首页 > 游戏 > 手游 > 观察者模式(Observer Pattern)

观察者模式(Observer Pattern)

2024/12/23 17:02:34 来源:https://blog.csdn.net/dashalen/article/details/141570180  浏览:    关键词:观察者模式(Observer Pattern)

一.定义

(一)观察者模式定义

  • 简介:观察者模式也叫做发布订阅模式,定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则其所有依赖于它的对象都会收到通知并自动更新。

1.Subject被观察者

  • 定义被观察者必须实现的职责,它必须能够动态地增加、取消观察者。一般是抽象类或者实现类,仅仅完成作为被观察者必须实现的职责;
  • 职责管理观察者和通知观察者。

2.Observer观察者

  • 观察者接收到消息后,都进行update(更新)操作,对接收到的信息进行处理。

3.ConcreteSubject具体的被观察者

  • 定义被观察者自己的业务逻辑,同时定义对哪些事件进行通知。

4.ConcreteObserver具体的观察者

  • 每个观察者收到消息之后的处理逻辑不同

(二)示例

1.观察者(Observer)

/*** 抽象观察者*/
public interface Observer {/*** 处理逻辑* @param ctx 接收数据上下文*/void dosomething(Object ctx);}

2.被观察者(Subject)

public abstract class Subject {//定义一个观察者集合private Set<Observer> obsSet = new CopyOnWriteArraySet<>();/*** 新增一个观察者* @param observer*/public void addObserver(Observer observer) {obsSet.add(observer);}public void deleteObserver(Observer observer) {obsSet.remove(observer);}/*** 通知观察者可以执行逻辑了* @param ctx*/public void notifyObserver(Object ctx) {for (Observer observer : obsSet) {observer.dosomething(ctx);}}}

3.具体被观察者(ConcreteSubject)

/*** 具体被观察者*/
public class ConcreteSubject extends Subject {public void dosomething(Object data) {//TODO 前置处理data相关逻辑,然后通知观察者super.notifyObserver(data);}
}

4.具体观察者(ConcreteObserver)

/*** 具体观察者*/
public class ConcreteObserver1 implements Observer {@Overridepublic void dosomething(Object data) {//TODO 观察者处理data逻辑System.out.println("observer1 handle data:" + data);}
}/*** 具体观察者*/
public class ConcreteObserver2 implements Observer {@Overridepublic void dosomething(Object data) {//TODO 观察者处理data逻辑System.out.println("observer2 handle data:" + data);}
}

5.高层模块使用

public class Invoker {public static void main(String[] args) {//创建一个被观察者ConcreteSubject subject = new ConcreteSubject();//定义观察者Observer observer1 = new ConcreteObserver1();Observer observer2 = new ConcreteObserver2();//添加观察者subject.addObserver(observer1);subject.addObserver(observer2);//执行subject.dosomething("data.data.");}
}

二.应用场景

【TODO】

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com