观察者模式是设计模式中非常重要的设计模式之一。主要特点是,向要获得信息的对象在观察平台注册,然后当感兴趣的事情发生时,平台通知每一个注册的观察者,观察者根据发生的事情来做出自己的行为。其中要点在于观察者要能方便注册,方便解除注册,观察平台在事情发生时通知他们。消息的发布 订阅传输方式就是采用观察者模式这种机理的。
观察者模式类图:
[img]http://dl.iteye.com/upload/attachment/364911/da16f36c-c9ac-3876-b121-d0f893b925dc.jpg[/img]
具体代码示例:
观察者接口
具体实现对象类:
测试类:
说明:观察者模式在消息订阅等其他场合应用广泛,是一种重要的设计模式。要点在于有存储订阅者的聚集,有触发通知的时间,有添加订阅,取消订阅的功能方法。优点在于只有当订阅者期望的事情发生时,订阅者才会被通知,从而完成订阅者期望的事件。
观察者模式类图:
[img]http://dl.iteye.com/upload/attachment/364911/da16f36c-c9ac-3876-b121-d0f893b925dc.jpg[/img]
具体代码示例:
观察者接口
package oberserverPattern;
public interface Obersever {
void changeState(int tag);
}
具体实现对象类:
package oberserverPattern;
public class Person implements Obersever {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void changeState(int tag){
if(tag==1)
System.out.println(this.name
+" changes his state from playing to hardworking");
if(tag==2)
System.out.println(this.name
+" changes his state from hardworking to playing");
}
}
package oberserverPattern;
import java.util.List;
public interface Subject {
void notify(Obersever obersever,int tag);
}
package oberserverPattern;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ConcreteSubject implements Subject{
private List<Obersever> obersevers= null;
public void notify(List<Obersever> obersevers,int tag) {
Iterator<Obersever> it = obersevers.iterator();
while(it.hasNext()){
notify(it.next(),tag);
}
}
@Override
public void notify(Obersever obersever,int tag) {
obersever.changeState(tag);
}
public List<Obersever> getList(){
if (obersevers==null)
return new ArrayList<Obersever>();
else
return obersevers;
}
}
package oberserverPattern;
public class Coder extends Person{
}
package oberserverPattern;
public class Boss extends Person{
private int tag;
public void changeState(int tag){
if(tag==1)
System.out.println(this.getName()
+"is coming");
if(tag==2)
System.out.println(this.getName()
+"has gone.");
}
public void setTag(int tag) {
this.tag = tag;
}
public int getTag() {
return tag;
}
}
测试类:
package oberserverPattern;
public class OberseverTest {
public static void main(String[] args){
Boss boss = new Boss();
boss.setName("boss wang");
boss.setTag(1);
Coder coder1 = new Coder();
coder1.setName("lxy");
Coder coder2 = new Coder();
coder2.setName("shuofeng");
ConcreteSubject subject = new ConcreteSubject();
subject.getList().add(coder1);
subject.getList().add(coder1);
boss.changeState(boss.getTag());
subject.notify(subject.getList(), boss.getTag());
coder1.changeState(boss.getTag());
coder2.changeState(boss.getTag());
System.out.println();
System.out.println("---------------Changer boss's state from 1 to 2-----------");
System.out.println();
boss.setTag(2);
boss.changeState(boss.getTag());
subject.notify(subject.getList(), boss.getTag());
coder1.changeState(boss.getTag());
coder2.changeState(boss.getTag());
}
}
说明:观察者模式在消息订阅等其他场合应用广泛,是一种重要的设计模式。要点在于有存储订阅者的聚集,有触发通知的时间,有添加订阅,取消订阅的功能方法。优点在于只有当订阅者期望的事情发生时,订阅者才会被通知,从而完成订阅者期望的事件。