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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yingxiake/article/details/51526268

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

开发中常见的场景:
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);

    }

}

猜你喜欢

转载自blog.csdn.net/yingxiake/article/details/51526268
今日推荐