首页 > 其他分享 >设计模式(3)--观察者模式

设计模式(3)--观察者模式

时间:2023-01-06 10:38:24浏览次数:25  
标签:-- void float 观察者 private mHumidity mPressure 设计模式 public


  • 概要:
    观察者模式原理
    观察者模式实例
    Java内置观察者
  • Internet气象站项目:
  1. 提供温度、气压和温度的接口
  2. 测量数据更新时需实时的通知第三方
  3. 需要设计开放性API,便于其他第三方公司也能接入气象站获取数据
  • 一个通常的设计方案:
package guanchazhe;


/**
* Created with IntelliJ IDEA.
* Description:
* User: wjx
* Date: 2019-04-14
* Time: 13:08
*/
public class CurrentConditions {
private float mTempature;
private float mPressure;
private float mHumidity;
public void update(float mTempature, float mPressure, float mHumidity){
this.mTempature = mTempature;
this.mPressure = mPressure;
this.mHumidity = mHumidity;
display();
}
public void display(){
System.out.println("温度"+mTempature);
System.out.println("气压"+mPressure);
System.out.println("湿度"+mHumidity);
}
}
package guanchazhe;


/**
* Created with IntelliJ IDEA.
* Description:
* User: wjx
* Date: 2019-04-14
* Time: 13:14
*/
public class InternetWeather {
public static void main(String[] args) {
CurrentConditions currentConditions = new CurrentConditions();
Weather weather = new Weather(currentConditions);
weather.setData(30,150,40);
}
}
package guanchazhe;


/**
* Created with IntelliJ IDEA.
* Description:
* User: wjx
* Date: 2019-04-14
* Time: 13:06
*/
public class Weather {
private float mTemperate;
private float mPressure;
private float mHumidity;
private CurrentConditions currentConditions;
public Weather(CurrentConditions currentConditions){
this.currentConditions = currentConditions;
}
public void dataChange(){
currentConditions.update(getmTemperate(),getmPressure(),getmHumidity());
}
public float getmTemperate() {
return mTemperate;
}


public float getmPressure() {
return mPressure;
}


public float getmHumidity() {
return mHumidity;
}


public void setData(float mTemperate, float mPressure, float mHumidity){
this.mTemperate = mTemperate;
this.mPressure = mPressure;
this.mHumidity = mHumidity;
dataChange();
}
}
  • 有些问题
    1)其他第三方公司接入气象站获取数据的问题
    2)无法在运行时动态的添加第三方
  • 观察者模式:
  • 订牛奶业务:到奶站告诉订牛奶登记注册
  • 奶站,Subject
  • 用户,Observer
  • Subject: 登记注册、移除和通知
  • Observer: 接受输入
  • 观察者模式的使用:对象之间多对一依赖的一种设计方案,被依赖的对象为Subject, 依赖的对象为Observer, Subject通知Observer变化
  • 重新设计:
Observer
package guanchazhe.update;
/**
* Created with IntelliJ IDEA.
* Description:
* User: wjx
* Date: 2019-04-14
* Time: 14:04
*/
public interface Observer {
public void update(float mTemperature, float mPressure, float mHumidity);


}
Subject
package guanchazhe.update;


/**
* Created with IntelliJ IDEA.
* Description:
* User: wjx
* Date: 2019-04-14
* Time: 14:07
*/
public interface Subject {
public void registerObserver(Observer observer);//注册观察者
public void removeObserver(Observer observer);//删除观察者
public void notifyObservers();//通知观察者
}
Subject
package guanchazhe.update;


import java.util.ArrayList;


/**
* Created with IntelliJ IDEA.
* Description:
* User: wjx
* Date: 2019-04-14
* Time: 14:12
*/
public class Weather implements Subject {
private float mTemperate;
private float mPressure;
private float mHumidity;
//定义观察者列表
private ArrayList<Observer> mObservers;


public Weather(){
mObservers = new ArrayList<Observer>();
}


public void dataChange(){
//通知是要放到数据改变中
notifyObservers();
}


public float getmTemperate() {
return mTemperate;
}


public float getmPressure() {
return mPressure;
}


public float getmHumidity() {
return mHumidity;
}


public void setData(float mTemperate, float mPressure, float mHumidity){
this.mTemperate = mTemperate;
this.mPressure = mPressure;
this.mHumidity = mHumidity;
dataChange();
}


@Override
public void registerObserver(Observer observer) {
mObservers.add(observer);
}


@Override
public void removeObserver(Observer observer) {
if(mObservers.contains(observer)){
mObservers.remove(observer);
}
}


@Override
public void notifyObservers() {
//通知所有对象有新的信息,获取每一个对象更新
for(int i = 0;i<mObservers.size();i++){
mObservers.get(i).update(getmTemperate(), getmPressure(),getmHumidity());
}
}
}
Observer
package guanchazhe.update;


/**
* Created with IntelliJ IDEA.
* Description:
* User: wjx
* Date: 2019-04-14
* Time: 14:08
*/
public class CurrentConditions implements Observer {
private float mTemperature;
private float mPressure;
private float mHumidity;


@Override
public void update(float mTemperature, float mPressure, float mHumidity) {
this.mTemperature = mTemperature;
this.mPressure = mPressure;
this.mHumidity = mHumidity;
display();
}
public void display(){
System.out.println("温度" + mTemperature);
System.out.println("气压"+ mPressure);
System.out.println("湿度" + mHumidity);
}
}
package guanchazhe.update;


/**
* Created with IntelliJ IDEA.
* Description:
* User: wjx
* Date: 2019-04-14
* Time: 14:11
*/
public class ForcastConditions implements Observer {
private float mTemperature;
private float mPressure;
private float mHumidity;


@Override
public void update(float mTemperature, float mPressure, float mHumidity) {
this.mTemperature = mTemperature;
this.mPressure = mPressure;
this.mHumidity = mHumidity;
display();
}
public void display(){
System.out.println("明温度" + mTemperature+1);
System.out.println("明气压"+ mPressure+1);
System.out.println("明湿度" + mHumidity+1);
}
}
Main
package guanchazhe.update;


/**
* Created with IntelliJ IDEA.
* Description:
* User: wjx
* Date: 2019-04-14
* Time: 14:23
*/
public class InternetWeather {
public static void main(String[] args) {
CurrentConditions currentConditions;
ForcastConditions forcastConditions;
Weather weather;
weather = new Weather();
currentConditions = new CurrentConditions();
forcastConditions = new ForcastConditions();


//注册观察者
weather.registerObserver(currentConditions);
weather.registerObserver(forcastConditions);
weather.setData(30,150,40);
weather.removeObserver(forcastConditions);
weather.setData(30, 120,40);
}


}
  • Java内置的观察者 :
  • Observable(类)==Subject(接口)实现注册移除删除观察者
  • Observer(接口)使用接口是因为update传递的信息,会因为对象不同采用不同的方式
  • 内置 观察者的注意点:
  • Observable因为不是接口所以不能做到多重继承
  • 同时通知的时候需要先进行this.setChanged()设置位true才可以进行通知


标签:--,void,float,观察者,private,mHumidity,mPressure,设计模式,public
From: https://blog.51cto.com/u_13987312/5992392

相关文章

  • Docker私有仓库以及Docker shell
    Docker搭建私有仓库公有云:比如百度云,dockerhub私有云:比如搭建到某个内网,docker搭建私有仓库:下载一个镜像docker默认使用的是dockerhubdocker仓库服务器就是docker注册服务......
  • Android画布(二)ShapeDrawable常用函数
    ShapeDrawable常用函数setBounds()用来指定当前ShapeDrawable在当前控件中的显示位置setBounds(intleft,inttop,intright,intbottom)setBounds(Rectbounds)getPaint......
  • 编写Dockerfile文件
    Dockerfile可以完成一些批量化的工作cdlsmkdirdockerfilecddockerfile/lsvimDockerfile//指定基础的镜像Fromcentos:latest//维护者信息MAINTAINERwjx//shell命令RUN......
  • Andorid自定义动画 文字与画布(一)
    Paint设置//设置画笔宽度paint.setStrokeWidth(5);//指定抗锯齿功能paint.setAntiAlias(true);//绘图样式paint.setStyle(Paint.Style.FILL);//设置文字对齐方式paint.setTe......
  • 物联网移动APP架构设计
    Android系统架构应用层SMS短信客户端程序、电话拨号程序、图片浏览器、Web浏览器等。这些应用程序都是用Java语言编写的,并且都是可以被开发人员开发的其他应用程序所替换应......
  • 基于Mockito的Android应用单元测试
    Mockito是java开发中常用的Mock库,在Android应用单元测试中比较常见在实际的单元测试中,测试的类之间会有或多或少的耦合,导致无法顺利的进行测试,这是就可以使用Mockito,该库可......
  • Dagger2依赖注入框架
    Dagger2简介:Dagger:“AfastdependencyinjectorforAndroidandJava“,其最大的好处就是莫跨界见解耦,这个耦合是由类之间的以来引起的,依赖注入的配置独立于初始化出,配......
  • MSTP配置
    全网所有交换机都要配置如下命令,包括接入,汇聚交换机:stpregion-configuration   region-nameHuawei    revision-level12    instance10vlan10......
  • Android文字与画布(二)
    画布:Canvas平移:translate()使用来实现画布平移的,向右是X轴正方向,向下是Y轴正方向,画布的原点是(0,0)平移后的画布的左上角是新的坐标原点voidtranslate(floatdx,floatdy)@Over......
  • 火山引擎DataLeap数据调度实例的 DAG 优化方案
    更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,并进入官方交流群实例DAG介绍DataLeap是火山引擎自研的一站式大数据中台解决方案,集数据集成、开发、运......