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

    运行结果:

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

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

  • 相关阅读:
    使用清华源进行pip install
    BERT和ULMFIT embedding比较文本分类结果
    Ubuntu16.04更新python3.5到python3.7
    base64方式显示控件
    在使用redis做缓存后,mybatis的延迟加载失效
    springboot:redis反序列化发生类型转换错误
    eclipse :代码自动补全不生效解决办法
    微信扫码支付:问题集锦
    微信扫码支付(4):统一下单
    微信扫码支付(3):获取验签秘钥
  • 原文地址:https://www.cnblogs.com/li-zhi-long/p/12018354.html
Copyright © 2011-2022 走看看