当前位置: 首页 > >

面试必知必会之设计模式:观察者模式(Observer Pattern)

发布时间:

观察者模式(Observer Pattern)

情景:在许多设计中,经常会涉及多个对象都对一个对象中的数据变化感兴趣,而且这多个对象希望跟踪这个对象的变化。


观察者模式包含了四种角色:


主题(Subject):主题是一个接口,该接口规定了具体主题需要实现的方法,比如,添加,删除观察者以及通知观察者数据跟新的方法


观察者(Observer):观察者是一个接口,该接口规定了具体观察者用来更新数据的方法。


具体主题(ConcreteSuject):具体主题是实现主题接口类的一个实例,该实例包含有可以经常发生变化的数据。具体主题要用一个集合来存放观察者的引用。


具体观察者(ConcreteObserver):具体观察者是实现观察者接口的一个实例。具体观察者包含有可以存放具体主题引用的接口变量,以便具体观察者让具体主题将自己的引用添加到具体主题的集合中去,使自己成为观察者,或让这个具体主题将自己删除。


UML类图:


情景一:有一个大学生和一个海归都需要及时知道人才市场的职位需求信息


实现代码:


package ObserverPattern;

public interface Subject {
public void addObserver(Observer o);
public void deleteObserver(Observer o);
public void notifyObserver();
public void giveNewMess(String string);
}

package ObserverPattern;

public interface Observer {
public void hearTelphone(String mess);
}

package ObserverPattern;

import java.util.ArrayList;

public class ConcreteSubject implements Subject {
ArrayList personlist;
String mess;
boolean changed;
ConcreteSubject(){
personlist = new ArrayList();
mess="";
changed=false;
}
@Override
public void addObserver(Observer o) {
// TODO Auto-generated method stub
if(!(personlist.contains(o))) {
personlist.add(o);
}
}

@Override
public void deleteObserver(Observer o) {
// TODO Auto-generated method stub
if(personlist.contains(o)) {
personlist.remove(o);
}
}

@Override
public void notifyObserver() {
// TODO Auto-generated method stub
if(changed) {
for(int i=0;i Observer observer=personlist.get(i);
observer.hearTelphone(mess);
}
changed=false;
}
}
public void giveNewMess(String str) {
if(str.equals(mess)) {
changed=false;
}else {
mess=str;
changed=true;
}
}
}

?


package ObserverPattern;

public class ConcreteObserver implements Observer{
Subject subject;
public ConcreteObserver(Subject subject) {
// TODO Auto-generated constructor stub
this.subject=subject;
subject.addObserver(this);
}
@Override
public void hearTelphone(String mess) {
// TODO Auto-generated method stub
System.out.println("大学生收到消息"+mess);

}

}

package ObserverPattern;

public class ConcreteObserver2 implements Observer{
Subject subject;
public ConcreteObserver2(Subject subject) {
// TODO Auto-generated constructor stub
this.subject=subject;
subject.addObserver(this);
}
@Override
public void hearTelphone(String mess) {
// TODO Auto-generated method stub
System.out.println("海归收到消息"+mess);

}

}

?


package ObserverPattern;

public class Test {
public static void main(String[] args) {
//主题
Subject center=new ConcreteSubject();
//观察者,并将观察者注册在主题中
Observer observer=new ConcreteObserver(center);
Observer observer2=new ConcreteObserver2(center);
center.giveNewMess("腾讯公司需要十个程序员");
center.notifyObserver();
}
}

运行效果:



观察者模式的优点:
具体主题和具体观察者是松耦合关系。由于主题接口依赖于观察者接口,因此具体主题只知道它的观察者是实现观察者某个类的实例,但并不知道是哪个类的实例,同样,在具体观察者中,只知道它依赖的主题是实现主题是某个类的实例,但不需要知道是哪个类的实例。观察者模式满足‘开-闭原则’。
观察者模式使用场景:
当一个对象的数据更新时需要通知其他对象,但这个对象又不希望和其他对象形成紧耦合。当一个对象的数据更新时,这个对象需要让其他对象各自更新自己的数据,但这个对象不知道具体有多少对象更新数据。

?



友情链接: