设计模式系列--Observer

一.类图

 

二.意图

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时所有依赖于它的对象都得到通知并被自动更新。

三.适用性

a) 当一个抽象模型有两个方面其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用

b) 当对一个对象的改变需要同时改变其它对象而不知道具体有多少对象有待改变。

c) 当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之你不希望这些对象是紧密耦合的。

四.实例

乡村爱情第五部中大脑袋为大拿出了一个主意,当杨总来的时候保安拦住杨总,同时通知王大拿。这细节就不细说了,如果想看的上网看就行了。这是一个典型的Observer设计模式。

 

package explore.observer;

public interface Observer {
public void notice();
}

package explore.observer;
//Observer对象
public class GuardLeader implements Observer {
@Override
public void notice() {
System.out.println("王总,杨总来了!");
}
}

package explore.observer;
//Observer对象
public class GuardMember implements Observer {
@Override
public void notice() {
System.out.println("杨总来了...唠了十分钟...");
}
}

package explore.observer;

public interface Observable {
public void addObserver(Observer o);
public void delObserver(Observer o);
public void inform();
}

package explore.observer;

import java.util.ArrayList;
import java.util.List;

//observable对象
public class Gate implements Observable {
public List<Observer> guards = null;

public Gate() {
guards = new ArrayList<Observer>();
}

public void openTheGate(String person) {
if("杨总".equals(person)) {
inform();
}
System.out.println("欢迎杨总!");
}

@Override
public void addObserver(Observer o) {
guards.add(o);
}

@Override
public void delObserver(Observer o) {
guards.remove(o);
}

@Override
public void inform() {
for(Observer o : guards) {
o.notice();
}

}
}

package explore.observer;

public class Client {
public static void main(String[] args) {
GuardLeader leader = new GuardLeader();
GuardMember member = new GuardMember();
Gate gate = new Gate();
gate.addObserver(leader);
gate.addObserver(member);
gate.openTheGate("杨总");
}
}

 

这个Observer模式是自定义的代码实现的,同时JDK中给出了Observer的实现接口分别是ObservableObserver。这两个类的用法俺就不说了,大家试着读一下API吧。

 

五.AwtObserver模式

 

Java awt包中用Observer模式最多了,写过照面程序的都知道:我们对程序的每个操作都要有Observer类监听,否则不会产生我们想要的结果。

 

看一下Button类的源码:

 

public class Button extends Component implements Accessible {
... ...
public synchronized void addActionListener(ActionListener l) {
if (l == null) {
return;
}
actionListener = AWTEventMulticaster.add(actionListener, l);
newEventsOnly = true;
}

public synchronized void removeActionListener(ActionListener l) {
if (l == null) {
return;
}
actionListener = AWTEventMulticaster.remove(actionListener, l);
}

protected void processActionEvent(ActionEvent e) {
ActionListener listener = actionListener;
if (listener != null) {
listener.actionPerformed(e);
}
}





posted @ 2012-03-19 17:05  focusJ  阅读(459)  评论(0编辑  收藏  举报