首页 > 其他分享 >设计模式—观察者模式

设计模式—观察者模式

时间:2023-12-20 14:02:06浏览次数:28  
标签:Subject void update 模式 观察者 state 设计模式 public subject

介绍

代码

观察者父类

只有一个属性 subject 表示订阅的主题。update 方法用于更新观察者本身

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

主题类

主题类 Subject 直到自己的订阅者们,每当主题状态改变的时候就通知所有订阅者。

public class Subject {
    private List<Observer> observers = new ArrayList<>();

    private int state;

    public void addObserver(Observer observer){
        this.observers.add(observer);
    }

    public void notifyAllObservers(){
        for (Observer observer : observers) {
            observer.update();
        }
    }
    
    public int getState() {
        return state;
    }

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

观察者实现类

有三个观察者实现类:BinaryObserverHexaObserverOctalObserver

public class BinaryObserver extends Observer{
    public BinaryObserver(Subject subject) {
        this.subject = subject;
        this.subject.addObserver(this);
    }

    @Override
    public void update() {
        System.out.println("BinaryObserver.update: " + Integer.toBinaryString(subject.getState()));
    }
}
public class HexaObserver extends Observer{
    public HexaObserver(Subject subject) {
        this.subject = subject;
        this.subject.addObserver(this);
    }

    @Override
    public void update() {
        System.out.println("HexaObserver.update: " + Integer.toHexString(subject.getState()));
    }
}
public class OctalObserver extends Observer{
    public OctalObserver(Subject subject) {
        this.subject = subject;
        this.subject.addObserver(this);
    }

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

测试

public class ObserverTest {

    @Test
    void test(){
        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);
    }
}

标签:Subject,void,update,模式,观察者,state,设计模式,public,subject
From: https://www.cnblogs.com/shixuanliu/p/17916331.html

相关文章

  • 组合模式揭秘:如何构建可扩展的树形结构
    什么是组合模式组合模式(CompositePattern)是一种结构型设计模式,它创建了对象组的树形结构,将对象组合成树状结构以表示“整体-部分”的关系。组合模式使得用户对单个对象和组合对象的访问具有一致性,即:组合能让客户以一致的方式处理个别对象以及组合对象。组合模式的核心原理组合模式......
  • Python实现软件设计模式6:单例模式 Singleton Pattern
    动机针对某个类,为了保证系统中只创建一个示例,并且易于被访问(例如操作系统的任务管理器,软件的登陆注册界面)自行创建这个实例,无法从外部创建这个实例,向系统提供这个实例饿汉式单例Java版本在类加载的时候,就创建对象,如果后续得不到使用,可能会造成内存资源浪费懒汉式单......
  • Redis数据库 | 发布订阅、主从复制、哨兵模式、缓存雪崩
    ......
  • Python实现软件设计模式5:原型模式 Prototype Pattern
    动机对象的克隆问题,想要复制出本对象的一个副本,属性方法一模一样从需求上来说,先快速克隆对象,后续根据需求再进行对象局部属性的修改区分为深克隆和浅克隆两个版本,默认为浅克隆角色Prototype抽象原型类ConcretePrototype具体原型类Client客户类浅克隆与深克隆......
  • 基于SaaS模式的云HIS信息管理系统源码
    云HIS全称为基于云计算的医疗卫生信息系统,是运用云计算大数据、物联网等新兴信息技术,按照现代医疗卫生管理要求,在一定区域范围内以数字化形式提供医疗卫生行业数据收集、存储、传递处理的业务和技术亚台云HIS系统采用主流成熟技术开发,软件结构简洁、代码规范易阅读,SaaS应用,全......
  • 适配器模式
    在你成功拿到五心之钢后,为了能够好好玩这把天选局,偷摸溜了出去,进到厕所,发现商店中静静躺着一张伊泽瑞尔,而后又在接下来的选秀中拿到铲子和腰带,你激动的合成了心之钢转,在你放上伊泽瑞尔后,发现你现在没有凯隐,因此你将一张布里茨放了上去,给它一张心之钢转,当当当!七心之钢!心之钢转就是......
  • 设计模式—模板模式
    介绍代码游戏模板类定义一个游戏模板虚类Game,抽象并规范好游戏的进行流程publicabstractclassGame{abstractvoidinit();abstractvoidstartPlay();abstractvoidendPlay();//模板publicfinalvoidplay(){//初始化......
  • 设计模式—策略模式
    介绍在策略模式(StrategyPattern)中一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。在策略模式定义了一系列算法或策略,并将每个算法封装在独立的类中,使得它们可以互相替换。通过使用策略模式,可以在运行时根据需要选择不同的算法,而不需要修改客户端代......
  • 工厂模式
    工厂模式最主要解决的问题就是创建者和调用者的耦合,在代码层面是将通过对不同且相近对象(类似华为手机和小米手机)的new创建方式,统一起来。1.简单工厂模式  由phone作为两手机的统一接口,使得factory直接返回phone即可,无需考虑xiaomi与meizu的返回不兼容问题,而factory能够帮......
  • 设计模式的关系
    泛化关系泛化关系用一条带空心箭头的直接表示,可以理解为继承eg:汽车是基类,而suv这辆车就是他的子类实现关系实现关系用一条带空心箭头的虚线表示;eg:将车作为一个接口类(模糊概念,比如跑的挺快),下边的小汽车或是自行车都是车这个模糊概念的实现 聚合关系聚合关系用一条带空......