设计模式之略见一斑(Observer观察者模式)
??? 用户通常通过调用对象的方法来收集该对象的信息。但是当这个对象发生变化的时候,就会出现这样的一个问题:依赖该对象的用户如何才能知道对象的信息已经发生了变化?
我们可能通过这样一种设计:创建一个对象,每当用户所关心的对象某个方面发生变化的时候,该对象负责通知相关对此消息感兴趣的用户。这种设计的问题在于只有用户自己才知道他关心的某对象的哪些方面,因而这个受关注的对象不应当承担这种通知用户的责任。解决方法之一就是:在受关注的对象收到信息之后,通知用户,然后由用户去查询对象的新状态。
?
Observer模式的意图就是在多个对象之间定义一个一对多的关系,以便当一个对象状态改变的时候,其他所有依赖于这个对象的对象都能够得到通知,并被自动更新。
?
1.例子
?
?? JE上的订阅采用的就是这个观察者模式了,我们可以订阅我们所感兴趣的用户A。当用户A更新博客时,我们就可以随时收到并查看。这里就涉及到两个对象,一个是消息发布者(Noticer),还有一个就是消息接收者(Observer)
事情上JE上的每个用户ID既是消息发布者也是消息接收者,怎么说呢?
?
?? 1.当用户A被一群人订阅时,那么它就是消息发布者,当他有写了新博客时,它就会通知所有订阅他的人,告诉他们我写了新博客了。
??
?? 2.同样,用户A他也可能订阅订阅别人的博客,这个时候他就是消息接收者了
?
?
下面就写个简单的代码示之:
?
首先定义消息发布者接口(Notice)跟消息接收者接口(Observer)
?
/** * 信息发布接口 * @author Administrator * */public interface Noticer {//添加订阅者 public void addObserver(Observer observer); //移除订阅者 public void removeObserver(Observer observer); //通知所有订阅者 public void notice(String message);}
?
?
/** * 消息接收者 * @author Administrator * */public interface Observer {//通知用户更新消息 public void update(String message);}
?
?
定义完接口之后,我们先来实现消息发布者接口(Noticer),其实现类NoticerImpl如下:
/** * 信息发布者 * @author Administrator * */public class NoticerImpl implements Noticer{private List<Observer> list = new ArrayList<Observer>();public void addObserver(Observer observer) {list.add(observer);}public void removeObserver(Observer observer) {list.remove(observer);}public void notice(String message) {// TODO Auto-generated method stubfor(Observer o:list){o.update(message);}}}
?
接着实现两个订阅者接口实现类分别为客户1,客户2:
public class Customer1 implements Observer {public void update(String message) {System.out.println("Customer1 ACCEPT message:"+message);}}public class Customer2 implements Observer {public void update(String message) {System.out.println("Customer2 ACCEPT message:" + message);}}
?
最后我们做一下简单的代码测试:
?
public class Test {public static void main(String[] args) {//创建发布者对象NoticerImpl impl = new NoticerImpl();//创建两个接收者Customer1 c1 = new Customer1();Customer2 c2 = new Customer2();impl.addObserver(c1);impl.addObserver(c2);//发布新消息impl.notice("Observer 模式要发布了!");}}
?
最后打印结果如下:
Customer1 ACCEPT message:Observer 模式要发布了! ?
Customer2 ACCEPT message:Observer 模式要发布了!
?
?
?
2.java的util包工具
?? java的util包中的Observable 其实就是观察者模式,它已经实现了相关的方法。
JDK此类表示模型视图范例中的 observable 对象,或者说“数据”。可将其子类化,表示应用程序想要观察的对象。?
附件里的utilobserver.rar有个例子,感兴趣者可以下载来看看.
?