您的位置:首页 > 编程语言 > Java开发

观察者模式

2016-07-23 18:34 441 查看
什么是观察者模式?
对象之间的一对一或者一对多的依赖,当一个主题对象发生改变的时候,它的所有依赖者都会收到通知。
直接看这个定义可能看了也是有点不明白什么是观察者模式,那我们用几个生活中的例子来说明下:
大家手机上都用过视频软件吧?当大家有喜欢的电视剧追的时候是不是又一个功能叫订阅?这个其实就是一种观察着模式,当用户点击订阅按钮时就相当于和这个电视剧产生了依赖关系,每当电视有更新的时候就会发通知给你告诉你有新的你就会去看。而像这样的例子生活中有很多,就不一一列举了。二java作为一门面相对象语言,所以很多地方用到了观察者模式,例如android系统本身的广播机制就采用了这种模式,还有如消息的推送也是采用的观察者模式。


那观察着模式具实现方式是怎么样的?接下来我们看看观察者模式的类图



Subject : 主题对象的接口,定义了注册,接触注册以及通知等方法

ProgramConcreteSubject :具体的主题对象,所有的观察者对象都在这里被维护,当其本身发生变化时会通知所有观察者

Observer:观察者接口 ,定义了一个接受主题对象状态变化的接口

PersonObserver:具体观察者对象,维护一个对ProgramConcreteSubject的引用,实现Observer接口,通过update()方法接收主题对象的通知。

所以通过上面的介绍几本了解了其结构,接下来看下具体的代码:

Subject

package demo.arvin.com.androiddemo.observer;

/**
* Created by arvin on 16/7/23.
*/
public interface Subject {
void notifyAllPerson();
void registerObServer(Observer observe);
void unRegisterObServer(Observer observe);
}


ProgramConcreteSubject

package demo.arvin.com.androiddemo.observer;

import java.util.ArrayList;

/**
* Created by arvin on 16/7/23.
*/
public class ProgramConcreteSubject implements Subject {

ArrayList<Observer> observerArrayList = new ArrayList<Observer>();
String name ="";
@Override
public void notifyAllPerson() {

for(Observer observer:observerArrayList){
observer.updateNewProgrm(name);
}
}

@Override
public void registerObServer(Observer observer) {

if(observer != null){
observerArrayList.add(observer);
}

}

@Override
public void unRegisterObServer(Observer observer) {

if(observer != null){
observerArrayList.remove(observer);
}

}

public void newProgramName(String name){

this.name = name;
notifyAllPerson();
}
}


Observer

public interface Observer {
void updateNewProgrm(String name);
}


PersonObserver

package demo.arvin.com.androiddemo.observer;
/**
* Created by arvin on 16/7/23.
*/
public class PersonObserver implements Observer {
@Override
public void updateNewProgrm(String name) {

System.out.println("有新的节目:"+name);

}
}


调用

public static void main(String[] args) {
ProgramConcreteSubject subject = new ProgramConcreteSubject();
PersonObserver observer1 = new PersonObserver();
PersonObserver observer2 = new PersonObserver();
subject.registerObServer(observer1);
subject.registerObServer(observer2);
subject.newProgramName("CCTV");
}


上面就是观察者模式的具体用法,其实不难,但是在实际过程中我们需要判断什么时候需要使用它,主要是当项目中某个对象状态改变而其它某些对象不要根据这个状态做相应的工作就可以用这个模式,那为什么不用其它模式了,其实最大的优点在于,现在的项目由于功能越来越多,很多项目的业务逻辑绑定太紧,造成项目的维护成本高,扩展性不强,而观察模式Subject和Observer之间是松偶合的,分别可以各自独立改变,是项目更容易扩展。

a38d
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java