(十四)观察者模式-代码实现

介绍

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

应用场景:例如新闻订阅模式,邮件订阅等,客户端是观察者,新闻发布平台是被观察者,最重要的一点是被观察者控制着主动权. 注意区分的是:和时下的新闻APP并不相同,现在新闻APP采用的是客户端掌握了新闻更新的主动权.

好处:一处改变,处处改变.

 

代码:

在Java中有已经预定义好的发布-订阅模式的抽象类和接口,直接使用就好了.如果想要自己实现,源代码也很简单,仿写即可.JDK中定义的订阅者接口是java.util.Observer,发布者抽象类是java.util.Observable

下面编写实例

//订阅者(观察者)

 

package note.com.observer;

import java.util.Observable;
import java.util.Observer;

/**
 * 观察者
 * @author lxz
 *
 */
public class 新闻收听者 implements Observer{

    private String name = "";
    private String message = null;
    
    public 新闻收听者(String name){
        this.name = name;
    }
    
    public void update(Observable o, Object arg) {
        this.setMessage((String)arg);
        System.out.println(name+":"+message);
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    
    

}

 

//发布者(被观察者)

package note.com.observer;

import java.util.Observable;

/**
 * 被观察者
 * @author lxz
 *
 */
public class 新闻发布者 extends Observable{

    private String message = null;
    
    public void releaseNews(String news){
        this.setMessage(news);
        setChanged();
        notifyObservers(news);
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
    
}

//测试类

package note.com.observer;

public class ObserverTest {

    public static void main(String[] args) {
        新闻发布者 from = new 新闻发布者();
        新闻收听者 to1 = new 新闻收听者("河南电视台");
        新闻收听者 to2 = new 新闻收听者("河北电视台");
        新闻收听者 to3 = new 新闻收听者("广东电视台");
        新闻收听者 to4 = new 新闻收听者("辽宁电视台");
        from.addObserver(to1);
        from.addObserver(to2);
        from.addObserver(to3);
        from.addObserver(to4);
        //以上准备监听完成
        //下面进行被观察者的修改,看观察者是否进行相应的观察操作
        from.releaseNews("国家农业税免收");
        
    }
}

//结果:

辽宁电视台:国家农业税免收
广东电视台:国家农业税免收
河北电视台:国家农业税免收
河南电视台:国家农业税免收

 

从例子中可以看到定义了4个订阅者,也就是四个电视台的对象和一个发布者.发布者更新新闻信息,四个电视台同时执行了update方法根据发布者的更新内容执行对应的更新操作.

 

posted on 2016-03-04 10:30  'Note' 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/qinggege/p/5241172.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值