设计模式之观察者模式

Java获取Google的简单天气预报 Java获取Google的简单天气预报.rar 里面有类,输出,具体的使用说明等 没事可以看看 立即下载

       观察者模式在实际开发中是一个使用率极高的一种设计模式,在设计模式中相比较来说也是必须要掌握的模式之一,观察者模式(有时又被称为发布(publish)- 订阅者(Subscribe)模式、模型 - 视图(View)模式等)是软件设计的一种模式,在此种模式中,一个目标物件管理所有相依赖于它的观察者物件,并且在它本身的状态发生改变时主动发出通知,此种模式通常来实现事件处理系统


一、观察者模式基本介绍


      观察者模式(Observer)完美的将观察者和被观察者的对象分离开,举个例子,用户界面可以作为一个观察者,业务数据则是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上,面向对象的设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面,一个对象只做一件事情,并且将它做好,观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性


二、观察者模式的定义


定义对象间的一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并自动更新


三、观察者模式的使用场景


       当你的项目中有多对一的依赖关系,可以考虑使用,因为观察者模式就是针对对象之间多对一依赖的一种设计方案,被依赖的对象为 Subject,依赖的对象为 Observer,Subject 通知 Observer 变化


四、观察者模式的模型图



1. Subject: 抽象主题,也就是被观察者(Observerable)的角色,抽象主题角色把所有观察者对象的引用保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象


2. ConcreteSubject: 具体主题,该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发出通知,具体主题角色又叫做具体被观察者(ConcreteObserverable)角色


3. Observer: 抽象观察者,该角色是观察者的抽象类,它定义了一个更新接口,使得在得到主题的更改通知时更新自己


4. ConcreteObserver: 具体观察者,该角色实现抽象观察者角色所定义的更新接口,以便在主题的状态发生变化时更新自身的状态


五、观察者模式实例演示


       前几天阅读《Head First》一书学习观察者模式时觉得里面举的例子就挺好,这里我们暂且也借用里面的例子来演绎,我们从从一个项目的需求实际出发,从普通的实现方法和用观察者模式实现的不同角度来对比在一些特定的场景模式下,使用观察者模式解决相应问题的方便的可扩展性以及便捷性


      需求:加入我们的团队刚刚接到一份合约,负责建立一个气象站应用,这个应用有两个公告板,可以分别显示目前的天气状况,当 WeatherObject 对象获得最新的测量数据时,公告板必须随时更新,而且这是一个可以扩展的气象站,气象站希望可以公布一组 API,让其他开发人员可以写出自己的公告板,可以插入此应用中,模型图如下:



WeatherData 知道如何和气象站取得联系,来获得天气的相关数据,当天气数据发生变化时,WeatherData 会更新相应的公告牌实时展示天气数据


1)先来看普通的实现方法


我们先来创建 WeatherData 类,实例代码如下


/**
 * 从气象站获取的天气数据的 WeatherData 类
 * 具有getter方法可以获取到温度、湿度、气压的测量值
 * Created by qiudengjiao on 2017/6/5.
 */

public class WeatherData {

    private float mTemperatrue;
    private float mHumidity;
    private float mPressure;

    private CurrentConditionsDisplay mCurrentConditionsDisplay;

    public WeatherData(CurrentConditionsDisplay currentConditionsDisplay) {
        this.mCurrentConditionsDisplay = currentConditionsDisplay;
    }

    public float getTemperatrue() {
        return mTemperatrue;
    }

    public float getHumidity() {
        return mHumidity;
    }

    public float getPressure() {
        return mPressure;
    }


    /**
     * 模拟气象站更新数据
     *
     * @param mTemperatrue
     * @param mHumidity
     * @param mPressure
     */
    public void setData(float mTemperatrue, float mHumidity, float mPressure) {
        this.mTemperatrue = mTemperatrue;
        this.mHumidity = mHumidity;
        this.mPressure = mPressure;

        dataChange();
    }

    /**
     * 调用WeatherData的getXXX方法,以取得最新的测量值
     * 通知公告板数据更新
     */
    public void dataChange() {
        mCurrentConditionsDisplay.updata(getTemperatrue(), getHumidity(), getPressure());
    }
}

 WeatherData 类主要是获取气象站传过来的数据,并通过 dataChange() 方法通知公告板进行实时的更新,实现的比较简单,相信大家一看就能明白


接下来看当前天气公告板 CurrentConditionsDisplay 类:

/**
 * 当前天气展示公告板
 * Created by qiudengjiao on 2017/6/5.
 */

public class CurrentConditionsDisplay {

    private float mTemperatrue;
    private float mHumidity;
    private float mPressure;

    /**
     * 更新数据
     *
     * @param mTemperatrue
     * @param mHumidity
     * @param mPressure
     */
    public void updata(float mTemperatrue, float mHumidity, float mPressure) {
        this.mTemperatrue = mTemperatrue;
        this.mHumidity = mHumidity;
        this.mPressure = mPressure;

        display();
    }

    /**
     * 模拟公告板显示
     */
    public void display() {
        System.out.println("今天的温度:::" + mTemperatrue);
        System.out.println("今天的湿度:::" + mHumidity);
        System.out.println("今天的气压:::" + mPressure);
    }
}

       这里也非常简单,就是把从 WeatherData 类从气象站中获取的传递过来的数据进行展示,这里我们用 updata 来传递数据,用 display 模拟显示装置来展示数据

现在我们来测试我们写的层序是否可行:

/**
 * 测试类
 */
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initData();

    }

    private void initData() {

        CurrentConditionsDisplay currentConditionsDisply = new CurrentConditionsDisplay();
        WeatherData weatherData = new WeatherData(currentConditionsDisply);
        //模拟设置相应的参数
        weatherData.setData(30, 50, 130);
        
    }
}

打印效果如下:


这样我们就实现了相应的需求,但是现在我们来思考一下,我们的实现有什么不对?

       这里我们的实现是针对具体的编程实现,试想一下,我们现在又有新的公告板,或者想删除刚才创建的公告板,这样我们就需要不停的去修改我们的程序,去增加或者删除公告板,不停地修改我们的程序显然不利于扩展,接下来我们就来看看着我们的项目中使用观察者模式是如何解决这些问题的


2)用观察者模式来实现


2.1 首先设计气象站:

先来看一下这个设计图,这张设计图其实是在我们前面模型图的扩展:



       这里,Subject 抽象接口我们并不陌生,是我们的主题接口,现在 WeahterData 实现 Subject 接口,然后是观察者的抽象接口 Observer,所有气象组件(例如我们的公告板)都需要实现此观察者接口,这样主题在需要通知观察者时,有了一个共同的接口,然后我们也为公告板告板建立了一个共同的接口,公告板只需要实现 display() 方法


2.2 实现气象站


       现在我们开始来实现这个系统了,Java 为观察者模式提供了内置支持,我们先暂时不用它,先自己动手,虽然有些时候可以利用 Java 内置支持,但是有些时候我们自己建立一个,这样会更具有弹性,那我们就从建立接口开始吧


首先建立抽象主题 Subject 接口:

/**
 * 抽象主题接口
 * Created by qiudengjiao on 2017/6/6.
 */

public interface Subject {

    /**
     * 注册观察者,需要一个观察者作为变量
     *
     * @param o
     */
    public void registerObserver(Observer o);

    /**
     * 删除观察者,需要一个观察者作为变量
     *
     * @param o
     */

    public void removeObserver(Observer o);

    /**
     * 当主题发生改变时,这个方法会被调用,以通知所有观察者
     */
    public void notifyObservers();

}

接下来建立抽象观察者 Observer 接口:

/**
 * 抽象观察者接口
 * Created by qiudengjiao on 2017/6/6.
 */

public interface Observer {
    /**
     * 所有的观察者都必须实现update()方法,以实现观察者接口
     * 当气象观察值发生改变时,主题会把以下状态值当做方法的参数,传送给观察者
     *
     * @param temperatrue
     * @param humidity
     * @param pressure
     */
    public void update(float temperatrue, float humidity, float pressure);
}

然后我们再来建立公告板公共显示 DisplayElement 接口:

/**
 * DisplayElement接口只包含了一个方法display
 * Created by qiudengjiao on 2017/6/6.
 */

public interface DisplayElement {
    /**
     * 当公告板需要显示时调用此方法
     */
    public void display();
}

由于我们在代码中已经做了详细的注解,就不再一一具体讲解


2.3 在 WeatherData 中实现 Subject 主题接口

/**
 * WeathDate类
 */
public class WeatherDate implements Subject {

	// 用ArraList来记录观察者
	private ArrayList observers;
	private float temperature;
	private float humidity;
	private float pressure;

	public WeatherDate() {
		observers = new ArrayList();
	}

	/**
	 * 注册观察者
	 */
	@Override
	public void regiserObserver(Observer o) {
		observers.add(o);
	}

	/**
	 * 删除观察者
	 */
	@Override
	public void removeObserver(Observer o) {
		int i = observers.indexOf(o);
		if (i >= 0) {
			observers.remove(i);
		}
	}

	/**
	 * 把状态通知每一个观察者,因为观察者都通知实现了update 所有我们知道如何通知它
	 */
	@Override
	public void notifyObserver() {
		for (int i = 0; i < observers.size(); i++) {
			Observer observer = (Observer) observers.get(i);
			observer.update(temperature, humidity, pressure);
		}
	}

	/**
	 * 当气象站得到更新观测值时,我们通知观察者
	 */
	public void dateChange() {
		notifyObserver();
	}

	/**
	 * 模拟设置数据
	 * 
	 * @param temperature
	 * @param humidity
	 * @param pressure
	 */
	public void setDate(float temperature, float humidity, float pressure) {

		this.temperature = temperature;
		this.humidity = humidity;
		this.pressure = pressure;

		dateChange();
	}
}

2.4 现在我们来建立公告板

/**
 * 此公告板实现了Observer接口,所以可以从WeatherDate对象中获得改变
 * 它也实现了DisplayElement接口,因为我们规定,所用的公告板都行必须实现此接口
 *
 */
public class CurrentConditionsDisplay implements Observer, DisplayElement {

	private Subject weatherDate;
	private float temperature;
	private float humidity;
	private float pressure;

	/**
	 * 构造器需要WeatherDate对象(也就是主题),作为注册之用
	 * 
	 * @param weatherDate
	 */
	public CurrentConditionsDisplay(WeatherDate weatherDate) {
		this.weatherDate = weatherDate;
		weatherDate.regiserObserver(this);
	}

	/**
	 * 当update调用时,我们把相应的参数保存起来 然后调用display()
	 */
	@Override
	public void update(float temperature, float humidity, float pressure) {
		this.temperature = temperature;
		this.humidity = humidity;
		this.pressure = pressure;
		
		display();
	}

	/**
	 * display方法把今天的天气情况展示出来
	 */
	@Override
	public void display() {
		System.out.println("今天的温度是:::" + temperature);
		System.out.println("今天的湿度是:::" + humidity);
		System.out.println("今天的气压是:::" + pressure);
	}
}

2.5 我们来测试一下,看看情况

/**
 * 测试类
 */
public class WeatherStation {

	public static void main(String[] args) {
		// 首先,创建WeatherDate对象
		WeatherDate weatherDate = new WeatherDate();
		// 建立公告板
		CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(weatherDate);
		// 调用setDate,模拟设置气象数据
		weatherDate.setDate(30, 40, 150);
	}
}

2.6 测试台打印情况如下:




       这样我们就成功实现了天气情况的展示,在使用观察者模式之后,和原来的实现方式相比就有了更好的扩展性,很好的解决了我们的问题,接下来我们再来创建一个新的公告板,看看扩展效果


2.7 建立一个新的公告板


/**
 * 天气预报公告板
 */
public class ForecastDisplay implements Observer, DisplayElement {
	
	private Subject weatherDate;
	private float temperature;
	private float humidity;
	private float pressure;
	/**
	 * 构造器需要WeatherDate对象(也就是主题),作为注册之用
	 * 
	 * @param weatherDate
	 */
	public ForecastDisplay(WeatherDate weatherDate) {
		this.weatherDate = weatherDate;
		weatherDate.regiserObserver(this);
	}
	@Override
	public void update(float temperature, float humidity, float pressure) {
		this.temperature = temperature;
		this.humidity = humidity;
		this.pressure = pressure;
		
		display();
	}

	@Override
	public void display() {
		System.out.println("明天的温度是:::" + temperature);
		System.out.println("明天的湿度是:::" + humidity);
		System.out.println("明天的气压是:::" + pressure);	
	}
}


2.8 现在我们来修改一下测试类,代码如下:

/**
 * 测试类
 */
public class WeatherStation {

	public static void main(String[] args) {
		// 首先,创建WeatherDate对象
		WeatherDate weatherDate = new WeatherDate();
		// 建立公告板
		CurrentConditionsDisplay currentDisplay = new CurrentConditionsDisplay(weatherDate);
		// 建立预测公告板
		ForecastDisplay forecastDisplay = new ForecastDisplay(weatherDate);
		// 调用setDate,模拟设置气象数据
		weatherDate.setDate(30, 40, 150);
	
	}
}

这里我们添加了新的公告板,下面我们来看看打印的结果:



       这样新加入的公告板就实现了,解决了修改代码的问题,使得程序更加的易于扩展,也更加的健壮,大家可以自行模拟删除公告板,也是非常的简单,这里我们就不再演示,到目前为止,我们已经从无到有的完成了观察者模式,但是 Java API 有内置的观察者模式,java.util(package)内包含最基本的 Observer 接口与 Observable 类,这和我们的 Subject 接口与 Observer 接口很相似, Observer 接口与 Observable 类使用上更加方便,因为许多功能都已经实现好了,接下来我们就来看使用 Java 内置的观察者模式如何来实现我们刚才的需求


六、使用 Java 内置的观察者模式


首先,把 WeatherDate 改成使用 java.util.Observable

import java.util.Observable;

/**
 * 从气象站获取的天气数据的 WeatherData 类
 * 现在继承内置的 Observable
 * 我们不需要追踪观察者了,也不需要管理注册与删除(超类代替即可)
 * 所以我们把注册和删除的代码删掉
 * Created by qiudengjiao on 2017/6/5.
 */

public class WeatherData extends Observable {

    private float mTemperatrue;
    private float mHumidity;
    private float mPressure;

    /**
     * 构造函数也不用为了记住观察者们而创建数据集合了
     */

    public WeatherData() {

    }


    /**
     * 当气象站得到跟新观测值时,通知观察者
     */
    public void dataChange() {
        //在调用notifyObservers()之前,必须要先调用setChanged()来指示状态已经改变
        setChanged();
        notifyObservers();
    }

    /**
     * 模拟气象站设置更新数据
     *
     * @param temperatrue
     * @param humidity
     * @param pressure
     */
    public void setData(float temperatrue, float humidity, float pressure) {
        this.mTemperatrue = temperatrue;
        this.mHumidity = humidity;
        this.mPressure = pressure;

        dataChange();
    }

    public float getTemperatrue() {
        return mTemperatrue;
    }

    public float getHumidity() {
        return mHumidity;
    }

    public float getPressure() {
        return mPressure;
    }
}

接下来我们重做 CurrentConditionsDisplay 公告板:

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

/**
 * 当前天气展示公告板
 * 实现Java内置的Observer接口
 * Created by qiudengjiao on 2017/6/5.
 */

public class CurrentConditionsDisplay implements Observer {

    private Observable observable;
    private float mTemperatrue;
    private float mHumidity;
    private float mPressure;

    /**
     * 现在构造函数把Observable当参数
     * 并将CurrentConditionsDisplay登机为观察者
     *
     * @param observable
     */
    public CurrentConditionsDisplay(Observable observable) {
        this.observable = observable;
        observable.addObserver(this);
    }

    /**
     * 改变update()方法,增加Observable和数据对象作为参数
     *
     * @param o
     * @param arg
     */

    @Override
    public void update(Observable o, Object arg) {
        if (o instanceof WeatherData) {
            WeatherData weatherData = (WeatherData) o;
            this.mTemperatrue = weatherData.getTemperatrue();
            this.mHumidity = weatherData.getHumidity();
            this.mPressure = weatherData.getPressure();
            display();
        }
    }


    /**
     * 模拟公告板显示
     */
    public void display() {
        System.out.println("今天的温度:::" + mTemperatrue);
        System.out.println("今天的湿度:::" + mHumidity);
        System.out.println("今天的气压:::" + mPressure);
    }
}


测试类:

/**
 * 测试类
 */
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initData();
    }

    private void initData() {
        
        WeatherData weatherData = new WeatherData();
        CurrentConditionsDisplay currentConditionsDisply = new CurrentConditionsDisplay(weatherData);

        //模拟设置相应的参数
        weatherData.setData(30, 50, 130);
    }
}

我们来看看控制台打印结果如下:



      

       这样我们就在使用 Java 内置类的情况下也实现了业务需求,接下来我们来分析下使用 Java 内置方法有一点的不好处,这里大家注意到Observable 是一个类,你必须设计一个类去继承它,如果某类想同时具有 Observable 和另一个超类时,就会陷入两难,毕竟 Java 不支持多继承,这限制了 Observable 的复用潜力(而增加复用潜力正是我们设计模式的最原始动机),所以大家在使用观察者模式时也要相应的注意,好了,观察者模式我们到这里就讨论完毕了


Observer例子 实现例子 uml图(使用StarUml打开) 立即下载

相关推荐

请根据观察者模式,用Java语言设计并实现气象站程序。

请根据观察者模式,用Java语言设计并实现气象站程序。其中,部分代码已经写好,包括: • 观察者接口 • 主题接口 • 显示板接口 • 测试程序 请在此框架下,继续完成CurrentConditionsDisplay、ForecastDisplay、StatisticsDisplay等显示板类, 以及气象数据类(WeatherData), 使程序最终运行结果如下图所示(XXXX为本人学号): Currents conditions:80.0F degress and 65.0% humidity (by 1508060330) Avg/Max/Min:temperature = 80.0/80.0/80.0/ (by 1508060330) Forecast (by 1508060330):improving weather on the way Currents conditions:82.0F degress and 70.0% humidity (by 1508060330) Avg/Max/Min:temperature = 81.0/82.0/80.0/ (by 1508060330) Forecast (by 1508060330):watch out for cooler,rainy weather Currents conditions:78.0F degress and 90.0% humidity (by 1508060330) Avg/Max/Min:temperature = 80.0/82.0/78.0/ (by 1508060330) Forecast (by 1508060330):more of the same

2 观察者模式

一、定义当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。二、介绍意图:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。主要解决:一个对象状态改变给其他对象通知的问题,而且要考虑到易用和低耦合,保证高度的协作。何时使用:一个对象(目标对...

qq_24828741的博客 239

深入浅出设计模式之观察者模式总结(二)附例子

NULL 博文链接:https://zfms.iteye.com/blog/1487519

2.观察者模式

以具体的需求出发,通俗易懂,循序渐进的学习观察者模式

c1776167012的博客 632

websocket++简单使用及实例分析

下面小编就为大家带来一篇websocket++简单使用及实例分析。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

Python-Opencv中的膨胀和腐蚀

Python-Opencv中的膨胀和腐蚀 腐蚀和膨胀是对白色部分(高亮部分)而言的,不是黑色部分。 膨胀就是图像中的高亮部分进行膨胀,“邻域扩张”,效果图拥有比原图更大的高亮区域。腐蚀就是原图中高亮部分被腐蚀,“邻域被蚕食”,效果图拥有比原图更小的高亮区域。 1.膨胀 膨胀过程是有一个结构元素或者模板去在原图像素比对,当比对过程中,中心像素位置的值根据其八邻域取或运算,或运算为1就取自己的中心值,...

qq_44262417的博客 1万+

Java设计模式(2 / 23):观察者模式

定义 观察者(Observer)模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。 OO设计原则:为了交互对象之间的松耦合设计而努力。 案例:气象监测应用 概括 此系统中的三个部分是 气象站(获取实际气象数据的物理装置) WeatherData对象(追踪来自气象站的数据,并更新布告板) 布告板(显示目前天气状况给用户看) WeatherData对象知道如何跟物理气象站联系,以取得更新的数据。 WeatherData对象会随即更新三个布告板的显示:

KISS 774

Python实战:逐笔高频因子构建与回测全流程解析

本文详细解析了使用Python构建与回测逐笔高频因子的全流程。从逐笔数据的价值与清洗入手,通过实战代码演示了‘大买成交金额占比’因子的计算逻辑,并重点阐述了因子正交化处理的重要性以剔除风格影响。最后,提供了一个经典的分位数回测框架来验证因子有效性,并分享了数据质量、计算效率与过拟合等核心避坑指南。

grass的博客 391

基于Spring Boot与高德API的天气预报系统实战:从接口集成到数据库设计完整实现

本文详细讲解如何基于Spring Boot框架构建完整的天气预报系统。涵盖高德地图API的深度集成、MySQL数据库表设计、MyBatis数据持久化、定时任务调度等核心技术,提供完整的实体类设计、JSON解析策略及RESTful接口实现方案。通过本教程,您将掌握第三方API对接、复杂数据结构解析、企业级定时任务配置等实战技能。

Zyw907155124的博客 1万+

一种解决STM32多串口同时收发的方法

在做项目中,遇到了同时调用串口通信时程序崩溃的问题,在项目中,串口1用作调试串口,串口2用作MQTT通信串口,串口3用作下位机通信串口, 串口1重定向以后,用库函数自带的printf函数打印字符串 串口2使用自己写的u2_printf函数,即va_list这套变参宏定义后使用vsprintf函数打印字符串 串口3刚开始使用串口2一样的打印方式,程序在调试调用到串口3打印函数时直接崩溃,后续将串口3改用dma转存输出,仍然无法正常调用 多次研究以后,采用三个串口都使用重定向后的库函数自带的printf

Zxp0605的博客 8796

海康VisionMaster全局通信实战:从数据接收到流程触发

本文详细解析了海康VisionMaster全局通信的实战应用,重点阐述了如何通过配置通信模块与编写全局脚本,实现从外部设备(如PLC)接收数据并触发内部视觉流程。文章以TCP/IP通信为例,深入讲解了数据接收、解析、全局变量设置及流程触发的核心代码与调试技巧,帮助用户打通自动化项目中的设备联动关键环节。

weixin_29295541的博客 569

实验五、天气预报

WeatherState.java public interface WeatherState { public void showState(); } Weather.java public class Weather { WeatherState state; public void show() { state.showState(); } public void setState(WeatherState s) { state=s; } } Weather...

m0_65540967的博客 1797

OnlyOffice Docker部署全攻略:解除连接限制+文件大小限制+中文字体优化

本文详细介绍了OnlyOffice企业级Docker部署的完整解决方案,重点破解连接限制、文件大小限制和中文字体优化三大核心痛点。通过定制化镜像部署、性能调优配置和中文字体深度优化,帮助企业实现高效稳定的文档协作平台。

weixin_28837817的博客 368

设计模式之观察者模式(ObserverPattern)

设计模式之观察者模式(ObserverPattern) 文章目录设计模式之观察者模式(ObserverPattern)一.观察者模式(ObserverPattern)二.编程实例1.进制转换器2.客人敲门案例 一.观察者模式(ObserverPattern) 在生活中会遇到很多使用观察者模式的案例,比如股票跌涨后,股民作为观察者会对股票进行交易;客人来敲门,门铃响了之后管家就会去开门等等。其中观...

Worthy_Wang的博客 622

别再只看K线了!聊聊“板块联动”和“热点轮动”的跟踪方法与工具(实战派分享)

本文深入解析了如何通过板块联动和热点轮动构建高效交易系统。从三维验证框架到主流工具配置,再到持续性热点的五大特征,实战派交易员分享了识别市场主线和预判轮动方向的高阶技巧,帮助投资者摆脱单纯依赖K线的局限,提升交易决策效率。

weixin_29281941的博客 760

YOLOv10改进策略【模型轻量化】| MoblieNetV3:基于搜索技术和新颖架构设计的轻量型网络模型

本文记录的是基于MobileNet V3的YOLOv10目标检测轻量化改进方法研究。的模型结构是通过得来的,其中的基础模块结合了的深度可分离卷积、的线性瓶颈和倒置残差结构以及MnasNet中基于挤压和激励的轻量级注意力模块,使模型在性能、效率和灵活性方面都具有显著的优势。本文在替换骨干网络中配置了原论文中的small和large2种模型,以满足不同的需求。

Limiiiing的博客 514

设计模式之观察者模式ObserverPattern(十一)

观察者模式 (Observer Pattern) 是一种行为型设计模式,又被称为发布-订阅 (Publish/Subscribe) 模式,它定义了对象之间的一种一对多的依赖关系,使得当一个对象的状态发生变化时,所有依赖于它的对象都会自动收到通知并更新。

徐泗空的博客 1047

深入浅出讲解外部服务提供者 OAuth 2.0 帐户客户端创建与 ABAP 系统集成

本文详细介绍了在SAP ABAP平台配置OAuth 2.0客户端以安全调用外部Web服务的完整流程。主要内容包括:首先需要在外部服务提供者平台注册OAuth客户端,获取client ID和client secret;其次需特别注意重定向URI必须是公开可访问的地址;然后在ABAP系统中通过事务码OA2C_CONFIG配置OAuth客户端信息;最后阐述了常见的错误排查方法。文章强调了OAuth 2.0作为SAP系统与外部服务安全集成的标准协议,正确配置客户端是确保后续API调用安全可靠的关键前提。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1734

设计模式之ObserverPattern观察者模式

现实世界中,许多对象并不是独立存在的,其中一个对象的行为发生改变可能会导致一个或者多个其他对象的行为也发生改变。例如,某种商品的物价上涨时会导致部分商家高兴,而消费者伤心;还有,当我们开车到交叉路口时,遇到红灯会停,遇到绿灯会行。 在软件世界也是这样,例如,Excel 中的数据与折线图、饼状图、柱状图之间的关系;MVC 模式中的模型与视图的关系。所有这些,如果用观察者模式来实现就非常方便。 观察者Observer模式的特点和定义: 观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一

haoyuegongzi的博客 326

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

设计模式-观察者模式

观察者模式,是一种非常常见的设计模式,在很多系统中随处可见,尤其是涉及到数据状态发生变化需要通知的情况下。本文以AbstractCursor为例子,展开分析。观察者模式,Observer Pattern,是一个很实用的模式,本人曾经接触到的各种平台以及曾经参与项目中打印模板解释器中都用到了此模式。 1.意图定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知...

weixin_34268843的博客 285

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

设计模式-观察者模式-Observer Pattern

观察者模式的优点包括实现了观察者和被观察者之间的解耦,增加了程序的可扩展性,并且可以动态地添加或移除观察者。:观察者模式能够将被观察者(Subject)和观察者(Observer)解耦,使得被观察者的改变不会直接影响到观察者,两者之间的依赖关系降低。:在需要实现通知和消息传递的系统中,观察者模式可以用来通知用户或系统组件关于状态变化的信息,如电子邮件客户端中的新邮件通知。:在观察者模式中,如果一个观察者在更新时发生错误,可能会影响到其他观察者的更新,这需要在设计时考虑错误处理机制。

wesigj的博客 1483

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【24种设计模式】观察者模式(Observer Pattern)

这种模式实现了一种一对多的对象依赖关系,当一个对象的状态改变时,所有依赖它的对象都会得到通知并自动更新。总结起来,观察者模式通过定义主题和观察者之间的接口,实现了一种松耦合的对象间通信方式。观察者模式中,通知观察者的算法骨架是固定的,但具体的通知操作可以由不同的观察者进行实现。在状态模式中,状态的改变会导致行为的改变,而在观察者模式中,状态的改变会导致通知给观察者。发布-订阅模式:发布-订阅模式是观察者模式的一种扩展,它将观察者分组,通过消息队列、事件总线等机制实现观察者与主题之间的松耦合通信。

Bankcary的博客 632

设计模式-观察者模式(Observer Pattern)

观察者模式 定义 观察者模式,又被称为发布-订阅(Publish/Subscribe)模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象。 类型 行为型。 角色 抽象主题(Subject)角色:也叫抽象目标类,它提供了一个用于保存观察者对象的聚集类和增加、删除观察者对象的方法,以及通知所有观察者的抽象方法。 具体主题(Co...

kaven 1451

设计模式——行为型——观察者模式ObserverPattern

https://en.wikipedia.org/wiki/Observer_pattern

bbllbbcpt的专栏 304

c++ 设计模式_设计模式行为型:观察者模式(ObserverPattern)

定义对象之间的一种一对多依赖关系,使得每一个对象发生状态的变化时,其相关依赖对象皆得到通知并被自动更新,又称为发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependence)模式。结构图角色与理解观察者模式共分为四种角色: Subject(目标类):被观察的对象,内部定义一个观察者集合,并...

weixin_39974223的博客 110
上一篇: Java 接口回调机制
下一篇: 设计模式入门
QDJdeveloper
博客等级 码龄11年 108粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值