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

设计模式之观察者模式

2015-12-21 00:00 459 查看
摘要: 观察者模式又称为发布订阅模式,里面角色分为观察者,被观察者。被观察者的动作会通知给注册的观察者。

现在设计一个故事,监狱里面有犯人和警察,警察会监控犯人的一举一动。当犯人吃饭的时候,警察会收到通知。

观察者模式又称为发布订阅模式,里面角色分为观察者,被观察者。被观察者的动作会通知给注册的观察者。

现在设计一个故事,监狱里面有犯人和警察,警察会监控犯人的一举一动。当犯人吃饭的时候,警察会收到通知。

一、简单的观察者实现:

Observable:

public abstract class Observable {
private Vector<Observer> obs = new Vector<>();

public void notifyObs(Object param) {
for (Observer ob : obs) {
ob.update(param);
}
}

public void addObserver(Observer ob) {
this.obs.add(ob);
}

public void removeObserver(Observer ob) {
this.obs.remove(ob);
}

public int getObserverSize() {
return this.obs.size();
}

public boolean containObserver(Observer ob) {
return this.obs.contains(ob);
}
}


Observer:

public interface Observer  {
void update(Object param);
}


Criminal:

public class Criminal extends Observable {
public void eat(String food) {
System.out.println("criminal is eating " + food);
this.notifyObs(food);
}
}


Police A:

public class PoliceA implements Observer {
@Override
public void update(Object param) {
System.out.println("police A get message. param is "  + param);
}
}


Police B:

public class PoliceB implements Observer {
@Override
public void update(Object param) {
System.out.println("police A get message. param is "  + param);
}
}


Test:

public class Test {
public static void main(String[] args) {
Criminal criminal = new Criminal();
criminal.addObserver(new PoliceA());
criminal.addObserver(new PoliceB());
criminal.eat("西餐");
}
}


上面的代码非常简单,很容易看懂。Observable是对观察者的抽象,里面有个Vectory,放入的是观察者。当有观察者注册的时候就放入到Vectory里面。Crimimal继承了Observable,当犯人吃饭的时候就依次通知Vectory里面的观察者。

JDK里面本身就存在Observable和Observer两个类,方便我们直接使用观察者模式。

二、使用JDK里面观察者的实现

Criminal:

public class Criminal extends Observable {

public void eat(String food) {
System.out.println("criminal eat " + food);
super.setChanged();
notifyObservers("criminal is eating " + food);
}
}


Police A:

public class PoliceA implements Observer{
@Override
public void update(Observable o, Object arg) {
System.out.println("Police A watch : " + arg);
}
}


Police B:

public class PoliceB implements Observer {
@Override
public void update(Observable o, Object arg) {
System.out.println("Police B watch . " + arg);
System.out.println(o);
}
}


Test:

public class Test {
public static void main(String[] args) {
Criminal criminal = new Criminal();
criminal.addObserver(new PoliceA());
criminal.addObserver(new PoliceB());
criminal.eat("川菜");
}
}


二、观察者模式的缺点

当某些观察者执行时间过长,会导致后面的观察者过长的延迟.
解决办法:使用异步处理,无论是在观察者端通知的步骤使用异步还是被观察者收到通知然后执行的步骤使用异步,都可以.

观察者同时也可以是被观察者。广播链太长,可维护性很差。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息