9.观察者模式

9.观察者模式

1.观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式。观察者模式在目标与观察者之间建立一套触发体系,并降低了两者耦合关系,但是这个耦合关系并没有完全解除。观察者模式最经典的案例就是MQ的实现,各种MQ都使用了类似的模式。

2.观察者模式的主要参与对象有:

(1)抽象的观察者(定义取得通知的办法)

(2)实际观察者

(3)抽象的目标,即观察主题(定义添加和移除观察者的办法,自身改变通知观察者的办法)

(4)实际的主题

3.案例

具体场景是:观察者是三个屌丝,主题是一个美女,三个屌丝同为备胎,他们关注的目标为美女,某一天美女无聊,群发的一个消息给三个备胎。

4.实现

package com.java.dp.observe;

/**
 * @Author lizhilong
 * @create 2019/12/10 17:51
 * @desc 抽象的观察者
 */
public interface Observer {

    void  update(String message);
}
package com.java.dp.observe;

/**
 * @Author lizhilong
 * @create 2019/12/10 17:53
 * @desc 抽象的观察者的实现
 */
public class ObserverImpl implements Observer {

    private String name;

    public ObserverImpl(String name) {
        this.name = name;
    }

    @Override
    public void update(String message) {
        System.out.println("【" + name + "】" + "收到了:" + message);
    }
}
package com.java.dp.observe;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author lizhilong
 * @create 2019/12/10 17:56
 * @desc 定义抽象的观察主题
 */
public abstract class Subject {
    protected List<Observer> observers = new ArrayList<>();

    public void addObserver(Observer observer){
        observers.add(observer);
    }

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

    public abstract void  notify(String message);
}
package com.java.dp.observe;

/**
 * @Author lizhilong
 * @create 2019/12/10 18:01
 * @desc 观察主题实现
 */
public class GirlSubject extends Subject {
    @Override
    public void notify(String message) {
        observers.forEach(e -> e.update(message));
    }
}
package com.java.dp.observe;

/**
 * @Author lizhilong
 * @create 2019/12/10 18:05
 * @desc
 */
public class ObserverClient {

    public static void main(String[] args) {
        Observer observer1 = new ObserverImpl("备胎一号");
        Observer observer2 = new ObserverImpl("备胎二号");
        Observer observer3 = new ObserverImpl("备胎三号");

        Subject gril = new GirlSubject();
        gril.addObserver(observer1);
        gril.addObserver(observer2);
        gril.addObserver(observer3);

        gril.notify("小哥哥,今天晚上我有空,陪我去看电影!");
    }
}

运行结果:

【备胎一号】收到了:小哥哥,今天晚上我有空,陪我去看电影!
【备胎二号】收到了:小哥哥,今天晚上我有空,陪我去看电影!
【备胎三号】收到了:小哥哥,今天晚上我有空,陪我去看电影!

对于这个结果,我只能说,卧槽,无情,舔狗必死!!