JAVA设计模式之观察者复习

今天周末,抽空之余回顾了一下《Head first 设计模式》里面的观察者模式。昨天面试的时候,面试官问到相干的问题,自己回答的不是很好,大概是有点忘记了。

设观察者模式,又称订阅-发布模式,或者Swing监听器模式(其实java里面的util包存在着Observable,里面的Listener实现就是这种原理),它是一种一对多的依赖关系,就是多个观察者依赖一个主题(也可以说监听一个主题),主题一旦状态有变化,就通知观察者。

下面我就根据自己的复习效率边写博客边写一个简单的观察者demo,主要是为了掌握那种思想。


我准备写一个主题接口,Interface Subect,一个主题实现类,WeatherDate,一个观察者抽象类Observer,一个具体观察者,写一个update()方法,就是主题更新状态的时候会调用它进行操作,一个发布类DisPlay


1,主题抽象类

public interface Subject {//主题抽象类
public void registerObserver(Observer o);//向主题注册观察者
public void removeObserver(Observer o);//注销观察者
public void notifyObservers();//有通知就向观察者更新状态

}


2,观察者抽象类

public interface Observer {//观察者抽象类
public void update(float temp,float humidity,float pressure);
}


3,具体主题



public class WeatherData implements Subject {

private ArrayList observers;//集合类装观察者
float temp;
float humidity;
float pressure;

public WeatherData(){
System.out.println("实例化具体主题");
observers = new ArrayList();
}

public void registerObserver(Observer o) {

observers.add(o);

}



public void removeObserver(Observer o) {

int i = observers.indexOf(o);
if(i >= 0){
observers.remove(o);
}

}



public void notifyObservers() {

for(int i = 0;i < observers.size();i++){
Observer observer = (Observer) observers.get(i);
observer.update(temp, humidity, pressure);}//调用notifyObservers()后要从集合中获取已经注册的观察者,然后更新
}



public void setMessurements(float temp,float humidity,float pressure){

this.temp = temp;
this.humidity = humidity;
this.pressure = pressure;
   notifyObservers(); //更新主题状态信息的时候要去通知观察者,这是一种推的形式,观察者想得到信息,是被动获取的方法
}
}

4,具体Display,展示功能



public interface DisplayElement {
public void  display();
}


5,具体观察者





public class CurrentConditionDisplay implements Observer, DisplayElement {


private float temp;
private float humidity;
private Subject weatherdata;
public CurrentConditionDisplay(Subject weatherdata){
System.out.println("实例化具体的观察者,用来监听被观察者。");
this.weatherdata = weatherdata;
weatherdata.registerObserver(this);
}

public void display() {

System.out.println("Current conditions: " + temp + "F degrees and " + 
humidity + "% humudity"  );


}



public void update(float temp, float humidity, float pressure) {

this.temp = temp;
this.humidity = humidity;
//System.out.println("Current conditions: " + temp + "F degrees and " + 
// humidity + "% humudity" + pressure + "pressure" );
display();


}

}

6,Client测试



class ClientTest {



public static void main(String[] args) {

WeatherData weatherdata = new WeatherData();
CurrentConditionDisplay ccd = new CurrentConditionDisplay(weatherdata);
weatherdata.setMessurements(80,30,87);

}


}

这样一个简单的观察者模式就出来了,希望自己慢慢的掌握这种思想,都说设计模式是一个程序员修炼内功的必备技能,在面试中也经常被技术官问到,所以有什么理由不去掌握呢。哈哈哈····闪去打代码了,还有很多的面试等着自己去准备,god bless me

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值