java设计模式-观察者模式(广播机制,消息订阅)

设计模式 专栏收录该内容
18 篇文章 1 订阅

什么叫观察者模式:
观察者模式是广播机制,消息订阅和推送的核心设计。

开发中常见的场景:
1.手机中消息推送
2.后台群发信息

观察者模式例子(自己实现)
首先是定义观察者接口并使用三个子类实现

/**
 * 观察者接口
 * 
 * @author liuxg
 * @date 2016年5月27日 下午10:15:30
 */
public interface IObserver {

    public void process();

}

class Observer1 implements IObserver {

    @Override
    public void process() {

        System.out.println("Observer1执行动作");

    }

}
class Observer2 implements IObserver {

    @Override
    public void process() {

        System.out.println("Observer2执行动作");

    }

}
class Observer3 implements IObserver {

    @Override
    public void process() {

        System.out.println("Observer3执行动作");

    }

}

再定义主题,观察者若想获得消息,必须先注册

/**
 * 
 * @author liuxg
 * @date 2016年5月27日 下午10:12:18
 */
public class Subject {

    List<IObserver> list = new ArrayList<IObserver>();


    /***
     * 注册观察者
     * @param observer
     */
    public void registerObserver(IObserver observer){
        list.add(observer);
    }


    /**
     * 广播消息
     */
    public void send(){ 
        for (IObserver observer : list) {
            observer.process();
        }
    }

}

客户端这样子,我们这样子使用

public class Client01 {

    public static void main(String[] args) {
        IObserver observer1 = new Observer1();
        IObserver observer2 = new Observer2();
        IObserver observer3 = new Observer3();

        Subject subject = new Subject();
        subject.registerObserver(observer1);
        subject.registerObserver(observer2);
        subject.registerObserver(observer3);

        subject.send();

    }

}

接下来我们利用jdk的api来实现观察者模式
观察者模式例子(jdk api)

/**
 * 实现观察者
 * @author liuxg
 * @date 2016年5月28日 下午7:11:43
 */
public class MyObserver implements Observer {

    @Override
    public void update(Observable o, Object arg) {
        int state = ((ConcreteSubject)o).getState();

        System.out.println("state = " + state);


    }

}

接下来我们来实现主题信息


/**
 * 继承jdk的Observable来实现主题信息
 * @author liuxg
 * @date 2016年5月28日 下午7:10:52
 */
public class ConcreteSubject extends Observable{

    private int state ;

    public void set(int state) { //状态切换,广播信息
        this.state = state;

        setChanged();
        notifyObservers();

    }

    public int getState() {
        return state;
    }

    public void setState(int state) {
        this.state = state;
    }
}

客户端测试,可以这样子

public class Client02 {

    public static void main(String[] args) {
        ConcreteSubject obj = new ConcreteSubject();

        MyObserver observer = new MyObserver();
        obj.addObserver(observer);

        obj.set(123);

    }

}
  • 0
    点赞
  • 2
    评论
  • 2
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值