设计模式学习笔记(七)—Observer观察者模式

 《设计模式》一书对Observer是这样描述的:
定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知并自动更新。
举个例子,在现实生活中,父母与孩子是最亲密的人。父母做为孩子(被观察者)的监护人(观察者),当孩子和别人打架后,一定会告诉他的父母这件事(呵呵,当孩子很小时,通常会告诉父母,长大了以后,可能不会,这里的孩子指的是小孩子),当孩子获得奖学金后,也一定会告诉他的父母。下面我用Observer实现这个程序。代码如下:
import java.util.Vector;

class Children{
 static private Vector<Observer> obs;
 static private String state=null;
 static{
  obs=new Vector<Observer>();
 }
 public static void attach(Observer o){
  obs.addElement(o);
 }
 public static void detach(Observer o){
  obs.removeElement(o);
 }
 public void setState(String str){
  state=str;
 }
 public String getState(){
  return state;
 }
 public void notifyObs(){
  for(Observer o:obs){
   o.update(this); 
  }
 }
}
interface Observer{
 public void update(Children child);
}
class Parent implements Observer{
 public void update(Children child){
  if(child.getState().equals("fight")){
   System.out.println("Parent,他和别人打架了");
  }else if(child.getState().equals("scholarship")){
   System.out.println("告诉Parent,他得到了奖学金");
  }
 }
}
class Mother implements Observer{
 public void update(Children child){
  if(child.getState().equals("fight")){
   System.out.println("告诉Mother,他和别人打架了");
  }else if(child.getState().equals("scholarship")){
   System.out.println("告诉Mother,他得到了奖学金");
  }
 }
}
public class Client {

 public static void main(String[] args) {
  Children child=new Children();
  Observer parent=new Parent();
  Observer mother=new Mother();
  child.attach(parent);
  child.attach(mother);
  child.setState("fight");
  child.notifyObs();
  child.setState("scholarship");
  child.notifyObs();

 }

}

输出如下:
告诉Parent,他和别人打架了
告诉Mother,他和别人打架了
告诉Parent,他得到了奖学金
告诉Mother,他得到了奖学金
 小结:对于Observer模式,触发事件的对象-Subject对象无法预测可能需要知道该事件的所有对象。为了解决这一问题,我们创建一个Observer接口,要求所有的Observer负责将自己注册到Subject上。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值