zoukankan      html  css  js  c++  java
  • 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("小哥哥,今天晚上我有空,陪我去看电影!");
        }
    }

    运行结果:

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

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

  • 相关阅读:
    sparql学习sparql示例、dbpedia在线验证
    中国绿卡
    逾期率的水有多深,你知道吗?
    ICO和区块链区别
    What are the benefits to using anonymous functions instead of named functions for callbacks and parameters in JavaScript event code?
    Link static data in sql source control
    sql data compare
    viewbag
    多态的实际使用
    win10 sedlauncher.exe占用cpu处理
  • 原文地址:https://www.cnblogs.com/li-zhi-long/p/12018354.html
Copyright © 2011-2022 走看看