【设计模式】观察者模式

观察者模式详解

【设计模式】观察者模式

缘由是学校一门移动运用开发的课,在学习girhub某大佬的源码后发现了

@Subscribe(threadMode = ThreadMode.MAIN)

别名

Observer模式

依赖(Dependents)

发布-订阅模式(Publish-Subscribe)

概念

Observer模式定义对象间的一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。JDK里提供的observer设计模式的实现由java.util.Observable类和 java.util.Observer接口组成。从名字上可以清楚的看出两者在Observer 设计模式中分别扮演的角色:Observer是观察者角色,Observable是被观察目标(subject)角色。

对象

Observer :观察者

Observable :被观察对象

JAVA观察者模式

img

其中java中自带了函数接口

import java.io.*;
import java.math.BigInteger;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

class Water extends Observable implements Runnable {
    private long water=0;

    public long getWater() {
        return water;
    }

    public void setWater(long water) {
        this.water = water;
    }

    @Override
    public void run() {
        while(true) {
            try {
                setChanged();
                //此处不置时模式为pull模式,即需要自己去订阅而非推送
                notifyObservers(this);
                water++;
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

class WaterMeter implements Observer{
    Observable observable;
    long water;
    WaterMeter(Observable observable){
        this.observable=observable;
        observable.addObserver(this);
    }
    @Override
    public void update(Observable o, Object arg) {
        if (arg instanceof Water) {//判断主题是否对应 、

            Water water = (Water)arg;
            this.water = water.getWater();
            display();
        }
    }
    public void display() {
        System.out.println("Current water: " + water);
    }
}
public class Main {
    public static void main(String[] args) throws IOException {
        AReader reader = new AReader(System.in);
        AWriter writer = new AWriter(System.out);
        Water water=new Water();
        WaterMeter waterMeter=new WaterMeter(water);
        new Thread(water).start();
        reader.close();
        writer.close();
    }
}

回到主题

@Subscribe

直接上demo

public class TestEvent {
    private int message;
    public TestEvent(int message) {        
        this.message = message;
        System.out.println(message);
    }
    public int getMessage() {
        return message;
    }
}
public class EventListener {
    public int lastMessage = 0;

    @Subscribe
    public void listen(TestEvent event) {
        lastMessage = event.getMessage();
        System.out.println(lastMessage);
    }

    public int getLastMessage() {      
        return lastMessage;
    }
}

此时代码相当于简化上式代码,用注解实现迅速观察。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值