设计模式-观察者模式

观察者模式:一种一对多的关系,一个被观察者 Observable,多个观察者 Observer,被观察者发布消息到观察者.

代码示例:模拟微信公众号 实现 订阅主题为被观察者
订阅主题接口

/**
 * 订阅的主题  所有主题实现当前接口  (被观察者)
 * @author soda
 *
 */
public interface Subject {
     /**
      * 注册一个观察者
      * @param observer
      */
     void registerObserver(Observer observer);

     /**
      * 移除一个观察者
      */
     void removeObserver(Observer observer);

     /**
      * 推送一条消息
      * @param msg
      */
     void setMsg(String msg);
}

3D彩票订阅号 实现订阅主题接口

/**
 * 3D彩票订阅号
 * @author soda
 *
 */
public class ThreeDSubject implements Subject {

     private List<Observer> observers = new ArrayList<Observer>();

     public void registerObserver(Observer observer) {
          if (!observers.contains(observer)) {
              observers.add(observer);
          }
     }

     public void removeObserver(Observer observer) {
          if (observers.contains(observer)) {
              observers.remove(observer);
          }
     }

     public void setMsg(String msg) {
          for(Observer observer : observers) {
              observer.update(msg);
          }
     }

}

订阅用户 观察者接口

/**
 * 观察者的接口 所有观察者必须实现此接口
 * @author soda
 *
 */
public interface Observer {
     /**
      * 更新一条消息
      * @param msg
      */
     void update(String msg);
}

一个观察者

public class Observer1 implements Observer {

     private Subject subject;

     public Observer1(Subject subject) {
          this.subject = subject;
          subject.registerObserver(this);
     }

     public void update(String msg) {
          System.out.println("我是观察者1, 今天的彩票号码是"+msg+",我要发财啦!");
     }

}

测试

public class Test {

     public static void main(String[] args) {
          ThreeDSubject threeDSubject = new ThreeDSubject();
          Observer1 observer1 = new Observer1(threeDSubject);
          Observer2 observer2 = new Observer2(threeDSubject);
          threeDSubject.setMsg("123456");
     }
}

使用系统 提供的被观察者类和观察者接口实现

订阅号

/**
 * 3D彩票订阅号
 *
 * 继承系统提供的observable 实现 被观察者
 * @author soda
 *
 */
public class ThreeDSubject extends Observable {
     private String msg;

     public String getMsg() {
          return msg;
     }

     public void setMsg(String msg) {
          this.msg = msg;
          //设置数据已改变
          setChanged();
          //通知所有观察者数据发生改变
          notifyObservers();
     }

}

观察者

/**
 * 观察者
 * 实现系统提供的观察者接口  Observer
 * @author soda
 *
 */
public class ObserverStudent implements Observer {

     /**
      * 订阅一个主题
      */
     public void subscribeSubject(Observable observable) {
          observable.addObserver(this);
     }

     /**
      * 处理更新的消息
      */
     @Override
     public void update(Observable o, Object arg) {
          //分别处理每个主题推送的消息
          if (o instanceof ThreeDSubject) {
              ThreeDSubject subject = (ThreeDSubject) o;
              String msg = subject.getMsg();
              System.out.println("收到消息:今天的3D开奖号码是:"+msg);
          }
     }
}

感谢鸿洋大神的教程设计模式 观察者模式 以微信公众服务为例

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值