观察者模式的缺点:运行效率较低,一个被观察者,多个观察者时,开发代码和调试会比较复杂,java中消息的通知是默认顺序执行的,若其中一个观察者卡壳,会影响到此观察者后面的观察者执行,影响整体的执行, 多级触发时的效率更让人担忧。(遇到此问题应该考虑使用异步的方式)
观察者模式的邮电
实例:
package designMode.observable;
import java.util.Observable;
/**
* @ClassName: Wolf 被观察者
* @Description:1个被观察者可以被多个观察者观察
* @date: 2018年2月5日
* @修改备注:
*/
public class Wolf extends Observable{
private String name;
private String state;
Wolf(String name) {
this.name = name;
}
public void cry(String state){
this.setState(state);
this.setChanged();
this.notifyObservers(state);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}
package designMode.observable;
import java.util.Observable;
import java.util.Observer;
/**
* 作为观察者、监听者使用
* @author zhangLu
* @date 16-05-23
*/
public class Sheep implements Observer {
private String state = " 吃草ing。。。";
private String name;
public Sheep(String name){
this.name = name;
}
public void update(Observable o, Object arg) {
Wolf wolf = (Wolf)o;
System.out.println(wolf.getName()+" "+arg+"; "+this.getName()+" running.....");
setState("逃跑running");
try {
Thread.sleep(5*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(wolf.getName()+" is stop!"+" "+this.getName()+"可以停下继续吃草了。。。");
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
package designMode.observable;
import java.util.Observable;
import java.util.Observer;
/**
* @ClassName: Rabbit "兔子"
* @Description:观察者对象
* @date: 2018年2月5日
* @修改备注:
*/
public class Rabbit implements Observer{
private String name;
private String state ="吃草ing...";
public Rabbit(String name){
this.name = name;
}
@Override
public void update(Observable o, Object arg) {
Wolf wolf = (Wolf)o;
System.out.println(wolf.getName()+" "+arg+"; "+this.getName()+" running.....");
setState("逃跑running");
try {
Thread.sleep(5*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(wolf.getName()+" is stop!"+" "+this.getName()+"可以停下继续吃草了...");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}
package designMode.observable;
/**
* @ClassName: TestObserver
* @Description:观察者模式
* 多个观察者执行相关的行为动作是顺序执行的,一个观察者行为动作未执行完毕时,其他的观察者的行为是会被阻塞,无法执行的
* 一旦一个观察者的行为动作受到阻塞,其他观察者的行为动作就无法执行
* @date: 2018年2月5日
* @修改备注:
*/
public class TestObserver {
public static void main(String[] args) {
Wolf wolf = new Wolf("wolf1");
Sheep sheep1 = new Sheep("sheep1");
Sheep sheep2 = new Sheep("sheep2");
Sheep sheep3 = new Sheep("sheep3");
Rabbit rabbit1 = new Rabbit("rabbit1");
//注册观察者,加入不同类型的观察者对象
wolf.addObserver(sheep1);
wolf.addObserver(sheep2);
wolf.addObserver(sheep3);
wolf.addObserver(rabbit1);
//删除观察者
wolf.deleteObserver(sheep3);
//显示观察者的数量
System.out.println("观察者对象的数量: "+wolf.countObservers());;
String wolfState = "is coming with hungry";
//wolf begin cry
for (int i = 0; i < 2; i++) {
wolf.cry(wolfState);
try {
Thread.sleep(3*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("第"+(++i)+"次执行完毕!");
--i;
}
}
}