设计模式之观察者模式

心已赠人 2022-04-16 06:40 329阅读 0赞

当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。
即目标发生更改通知时,观察者对象会收到通知

观察者模式通用代码

分为
推模型——主动把某一数据推送给观察者
拉模型——观察者主动到目标对象中获取数据,一般这种模型的实现中,会把目标对象自身对象自身通过update方法传递给观察者

拉模型

目标对象,它自动观察他的观察值,并提供注册(添加)和删除观察者的接口

  1. public class Subject {
  2. //用来保存注册的观察者对象
  3. private List<Observer> observers =new ArrayList<Observer>();
  4. /**
  5. * 添加集合中的指定观察者
  6. * @param observer
  7. */
  8. public void attach(Observer observer){
  9. observers.add(observer);
  10. }
  11. /**
  12. * 删除集合中指定观察者
  13. * @param observer
  14. */
  15. public void detach(Observer observer){
  16. observers.remove(observer);
  17. }
  18. /**
  19. * 通知所有注册的观察者对象
  20. */
  21. public void notifyObservers(){
  22. for(Observer observer:observers){
  23. observer.update(this);
  24. }
  25. }
  26. }

观察者接口,定义一个更新的接口给那些在目标发生改变的时候被通知的对象

  1. public interface Observer {
  2. /**
  3. * 更新的接口
  4. * @param subject 传入目标对象,方便获取相应的目标对象的状态
  5. */
  6. public void update(Subject subject);
  7. }

具体的目标对象,负责把有关状态存入到相应的观察者对象中

  1. public class ConcreteSubject extends Subject{
  2. //目标对象的状态
  3. private String subjectState;
  4. public String getSubjectState() {
  5. return subjectState;
  6. }
  7. public void setSubjectState(String subjectState) {
  8. this.subjectState = subjectState;
  9. //状态设置了 使用父类通知观察者
  10. this.notifyObservers();
  11. }
  12. }

具体的观察者对象,实现更新的方法,使自身的状态和目标的状态保持一致

  1. public class ConcreteObserver implements Observer {
  2. //观察者名字
  3. private String observerName;
  4. //观察者的状态
  5. private String observerState;
  6. private String observerHandle;
  7. public String getObserverHandle() {
  8. return observerHandle;
  9. }
  10. public void setObserverHandle(String observerHandle) {
  11. this.observerHandle = observerHandle;
  12. }
  13. public String getObserverName() {
  14. return observerName;
  15. }
  16. public void setObserverName(String observerName) {
  17. this.observerName = observerName;
  18. }
  19. /**
  20. * 获取目标类的状态同步到观察者的状态中
  21. * @param subject 传入目标对象,方便获取相应的目标对象的状态
  22. */
  23. @Override
  24. public void update(Subject subject) {
  25. observerState =((ConcreteSubject)subject).getSubjectState();
  26. System.out.println(observerName+"收到了:"+observerState+",处理方式"+observerHandle);
  27. }
  28. }

测试类

  1. public class Client {
  2. public static void main(String[] args) {
  3. //1.创建目标
  4. ConcreteSubject concreteSubject=new ConcreteSubject();
  5. //2.创建观察者
  6. ConcreteObserver concreteObserver1=new ConcreteObserver();
  7. concreteObserver1.setObserverName("观察者一号");
  8. concreteObserver1.setObserverHandle("第一种处理方式");
  9. ConcreteObserver concreteObserver2= new ConcreteObserver();
  10. concreteObserver2.setObserverName("观察者二号");
  11. concreteObserver2.setObserverHandle("第二种处理方式");
  12. //3.注册观察者
  13. concreteSubject.attach(concreteObserver1);
  14. concreteSubject.attach(concreteObserver2);
  15. //目标设置状态
  16. concreteSubject.setSubjectState("目标状态改变");
  17. }
  18. }

推模型

subject

  1. public void notifyObservers(){
  2. for(Observer observer:observers){
  3. observer.update(this);
  4. //observer.update(content);
  5. }
  6. }
  7. 改成——>
  8. public void notifyObservers(String content){
  9. for(Observer observer:observers){
  10. observer.update(content);
  11. }
  12. }

observer

  1. public void update(Subject subject);
  2. 改成——>
  3. public void update(String Content);

ConcreteSubject

  1. public void setSubjectState(String subjectState) {
  2. this.subjectState = subjectState;
  3. //状态设置了 使用父类通知观察者
  4. this.notifyObservers();
  5. }
  6. 改成——>
  7. //public void setSubjectState(String content){
  8. this.subjectState = subjectState;
  9. //状态设置了 使用父类通知观察者
  10. this.notifyObservers(content);
  11. }

ConcreateObserver

  1. public void update(Subject subject) {
  2. observerState =((ConcreteSubject)subject).getSubjectState();
  3. System.out.println(observerName+"收到了:"+observerState+",处理方式"+observerHandle);
  4. }
  5. 改成——>
  6. public void update(String content) {
  7. //observerState=content;
  8. System.out.println(observerName+"收到了:"+observerState+",处理方式"+observerHandle);
  9. }

发表评论

表情:
评论列表 (有 0 条评论,329人围观)

还没有评论,来说两句吧...

相关阅读

    相关 设计模式观察模式

    观察者模式 什么是观察者模式 观察者模式属于行为模式的一种,定义了对象的通用交流方式。 观察者模式定义了一对多的关系,一个对象改变了状态,则其它所有依赖

    相关 设计模式观察模式

    前言 使用场景: 1、拍卖的时候,拍卖师观察最高标价,然后通知给其他竞价者竞价。 2、西游记里面悟空请求菩萨降服红孩儿,菩萨洒了一地水招来一个老乌龟,这个乌龟

    相关 设计模式观察模式

    当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。 即目标发生更

    相关 设计模式观察模式

    定义 当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态。观察者模式提供给关联对象一种同步通信的手段,使某个对象与依赖它的其他对象之间保持状态同步

    相关 设计模式观察模式

     今天放假,又有时间继续啃《java设计模式》这本书了。每次学会一种设计模式内心都会有一种小小的成就感,但是懂是懂了,不知道会不会用。主要是现在没有什么项目经验,设计模式学了也

    相关 设计模式观察模式

    [上一篇:设计模式之策略模式][Link 1] 故事要从气象站说起,气象站有个WeatherData对象,这个对象负责拿到所有的气象数据(温度、湿度、气压),而气象站同时也

    相关 设计模式观察模式

    1 观察者模式 当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都

    相关 设计模式——观察模式

    > 设计模式: > > 前辈们对代码开发经验的总结,是解决特定问题的一系列套路。它不是语法规定。而是一套用来提高代码可复用性、可维护性、可读性、稳健性、以及安全性的解决方案