观察者模式

什么是观察者模式

在这里插入图片描述我个人的理解是,观察者模式就是一个主题,多个观察者,就好比我们常常用的微信公众号,是不是一个公众号下面关注了很多的人?然后呢公众号有什么推送的时候,他会给所有关注他的人推送这些消息,而这些关注的用户又可以选择不关注(可能觉得没意思了)

UML类图如下

在这里插入图片描述

代码理解(书中的气象站例子)

1.编写主题
在这里插入图片描述
2.编写观察者
在这里插入图片描述
3.单独写一个显示数据的方法(这个可有可无的,只是为了测试效果)
在这里插入图片描述
4.具体的主题

/**
 * ClassName:WeatherData
 * Author:LFM
 * Date:2019/8/11 16:43
 **/
public class WeatherData implements Subject {
    private ArrayList observers;//考虑多个观察者会关注一个主题的
    //定义状态变量
    private float temperature;
    private float humidity;
    private float pressure;

    public WeatherData(){
        observers = new ArrayList();//在构造器完成初始化
    }
    @Override
    public void registerObeserver(Obeserver obeserver) {
        observers.add(obeserver);//注册方法,只需添加到集合里面即可
    }

    @Override
    public void removeObeserver(Obeserver obeserver) {
        int i = observers.indexOf(obeserver);//移除方法,得到要移除观察者的下标值
        if (i>=0){
            observers.remove(i);
        }
    }

    //通过这个方法手动设置一些气象数据,然后调用状态改变方法
    public void setMeasurements(float temperature,float humidity,float pressure){
        this.temperature = temperature;
        this.humidity = humidity;
        this.pressure = pressure;
        measurementsChanged();
    }

    //这个状态改变方法再调用通知方法
    public void measurementsChanged(){
        notifyObeservers();
    }
    @Override
    public void notifyObeservers() {
        //通过循环的方式通知每一个观察者
        for (int i=0;i<observers.size();i++){
            Obeserver obeserver = (Obeserver)observers.get(i);
            obeserver.update(temperature,humidity,pressure);
        }
    }
}

5.具体观察者
在这里插入图片描述
6.写个测试类
在这里插入图片描述
7.结果
在这里插入图片描述

还有一种就是继承Observerble类,这是JDK内置的观察者模式

1.我们不需要自己定义主题了,继承这个类就行了
记得导入相应的包

import java.util.Observable;

/**
 * 使用JDK内置的观察者模式
 * ClassName:WeatherData
 * Author:LFM
 * Date:2019/8/12 15:18
 **/
public class WeatherData extends Observable {
    private float temperature;
    private float humidity;
    private float pressure;

    //现在已经不需要在构造器里面保存观察者们了
    public WeatherData(){

    }

    //这是手动设置数据的方法
    public void setMeasurements(float temperature,float humidity,float pressure){
        this.temperature = temperature;
        this.humidity = humidity;
        this.pressure = pressure;
        measurementsChanged();//设置完数据就可以通知观察者了
    }

    public void measurementsChanged(){
        setChanged();//这个是父类的方法,用来记录状态是否改变
        notifyObservers();//这个是父类的方法,通知观察者
    }

    //以下三个getter方法是为了观察者手动拉数据而设立的
    public float getTemperature() {
        return temperature;
    }

    public float getHumidity() {
        return humidity;
    }

    public float getPressure() {
        return pressure;
    }
}

2.同样的也不需要自己写观察者接口了
这个DIsplayElement是我们用来显示数据的方法

import java.util.Observable;
import java.util.Observer;

/**
 * ClassName:CurrentConditionsDisplay
 * Author:LFM
 * Date:2019/8/12 15:26
 **/
public class CurrentConditionsDisplay implements Observer,DisplayElement {
    Observable observable;//引入主题依赖
    private float temperature;
    private float humidity;
    private float pressure;

    public CurrentConditionsDisplay(Observable observable){
        this.observable = observable;//初始化
        observable.addObserver(this);//调用父类的方法登记观察者
    }

    /*现在这个方法是jDK内置的更新方法
    前一个参数是确定具体的主题类型,后一个参数是主题
    notifyObservers方法里面传递过来的参数,不写默认为空
     */
    @Override
    public void update(Observable o, Object arg) {
        //确定观察者属于哪个主题,然后调用方法从该主题拉取数据
        if (o instanceof WeatherData){
            WeatherData weatherData = (WeatherData) o;
            this.temperature = weatherData.getTemperature();
            this.humidity = weatherData.getHumidity();
            this.pressure = weatherData.getPressure();
            display();
        }
    }

    @Override
    public void display() {
        System.out.println("Current conditions:"+
                temperature+"F degree and "+humidity+"% humidity"+pressure+"pressure");
    }
}

3.测试一下
在这里插入图片描述
4.结果
在这里插入图片描述
可以看出同样可以实现功能

总结,我们手动实现的观察者模式扩展性较好,JDK内置的较差,毕竟要继承不同的类,这就不符合多用组合,少用继承,面向接口编程了嘛

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值