码迷,mamicode.com
首页 > 其他好文 > 详细

9.观察者模式

时间:2019-12-10 18:32:22      阅读:94      评论:0      收藏:0      [点我收藏+]

标签:array   今天   ril   群发   lis   util   observer   使用   ack   

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("小哥哥,今天晚上我有空,陪我去看电影!");
    }
}

运行结果:

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

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

9.观察者模式

标签:array   今天   ril   群发   lis   util   observer   使用   ack   

原文地址:https://www.cnblogs.com/li-zhi-long/p/12018354.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!