设计模式之观察者模式

观察者模式的感觉就是设计一个主题,主题中的数据发生变化会通知所有观察者数据发生变化了,然后每个观察者根据变化的数据改变自我的展示情况。举个例子,就比如我们看电影,当电影的内容改变的时候,我们每个人的脑海里呈现的信息就会发生改变。

借用一下菜鸟教程的类图

一个主题有观察者列表,state两个成员变量。以及get、set方法,attach增加观察者方法,notifyall通知所有观察者方法。每个观察者继承Observer抽象类,观察者内心都有一个主题subject,因为他们要观察的就是这个主题,以及每个人自己的update方法,因为信息在每个人心中的展示可能不一样。

在这里插入图片描述
talk is cheep, show me the code.
在这里插入图片描述
Subject.java

package ObserverPattern;

import java.util.ArrayList;
import java.util.List;

public class Subject {
    //观察者列表
    private List<Observer> observers = new ArrayList<Observer>();


    //所有观察者观察的target
    private int state;

    public int getState(){
        return state;
    }

    public void setState(int state){
        this.state = state;
        notifyAllObervers();
    }

    //给主题添加观察者
    public void attach(Observer observer){
        observers.add(observer);
    }

    //通知所有观察者他们观察的target变了,让每个观察者更新自己的展示数据
    public void notifyAllObervers(){
        for (Observer observer : observers){
            observer.update();
        }
    }


}

Observer.java

package ObserverPattern;

public abstract class Observer {
    protected Subject subject;
    public abstract void update();
}

OctalObserver.java

package ObserverPattern;

public class OctalObserver extends Observer{
    public OctalObserver(Subject subject){
        this.subject = subject;
        this.subject.attach(this);
    }

    @Override
    public void update(){
        System.out.println("Hex String: "
        + Integer.toHexString(subject.getState()));
    }

}

BinaryObserver.java

package ObserverPattern;

public class BinaryObserver extends Observer {
    public BinaryObserver(Subject subject){
        this.subject = subject;
        //这个第二行说实话有点没看懂
        this.subject.attach(this);
    }

    @Override
    public void update(){
        System.out.println("Binary String:"
        +Integer.toBinaryString(subject.getState()));
    }

}

HexaObserver.java

package ObserverPattern;

public class HexaObserver extends Observer{
    public HexaObserver(Subject subject){
        this.subject = subject;
        this.subject.attach(this);
    }

    @Override
    public void update(){
        System.out.println("Hex String: "
        + Integer.toHexString(subject.getState()));
    }

}

main.java

//观察者模式
        Subject subject = new Subject();
        new HexaObserver(subject);
        new OctalObserver(subject);
        new BinaryObserver(subject);

        System.out.println("First state change: 15");
        subject.setState(15);
        System.out.println("Second state change: 10");
        subject.setState(10);

相关推荐

  1. 【前端设计模式观察模式

    2024-04-08 07:02:05       41 阅读
  2. 设计模式观察模式

    2024-04-08 07:02:05       32 阅读
  3. 设计模式观察模式

    2024-04-08 07:02:05       36 阅读
  4. 设计模式观察模式

    2024-04-08 07:02:05       34 阅读
  5. go 设计模式观察模式

    2024-04-08 07:02:05       30 阅读
  6. 设计模式观察模式

    2024-04-08 07:02:05       31 阅读
  7. C++ 设计模式观察模式

    2024-04-08 07:02:05       29 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-08 07:02:05       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-08 07:02:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-08 07:02:05       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-08 07:02:05       20 阅读

热门阅读

  1. Prompt提示词——常见的Prompt框架

    2024-04-08 07:02:05       15 阅读
  2. EXCEL学习笔记

    2024-04-08 07:02:05       15 阅读
  3. Mybatis学习笔记:多表关联,懒加载,缓存

    2024-04-08 07:02:05       12 阅读
  4. C语言正则表达式 regnext regreplace regreplaceAll

    2024-04-08 07:02:05       11 阅读
  5. uniapp使用vuex

    2024-04-08 07:02:05       15 阅读
  6. 一点点安全资料:数通知识扩展

    2024-04-08 07:02:05       15 阅读
  7. LeetCode71

    2024-04-08 07:02:05       10 阅读
  8. centos7 后台启动jar包

    2024-04-08 07:02:05       11 阅读