zoukankan      html  css  js  c++  java
  • java设计模式--观察者模式

      观察者模式:又称发布-订阅(Publish/Subscribe)模式。我们先看一个例子,现在直播行业越做越大,许多人都有关注自己喜欢的主播,人们订阅某一个主播,当该主播开播时,给订阅他的人发布提示说他开始直播了,这就是一个观察者模式的实例。

      通知者类,提供了增加和删除,以及通知观察者对象的方法。

    //网络主播类
    public class NetworkAnchor {
        //定义一个观察者的集合
        List<People> observers = new ArrayList<>();
    
        //当有人订阅了该主播,便把这个对象加入集合
        public void subscribe(People people){
            if(people!=null && !observers.contains(people)){
                observers.add(people);
            }
        }
        //取消订阅
        public void cancel(People people){
            observers.remove(people);
        }
        //主播开播时通知观察者
        public void notifyPeople(){
            for (People people: observers) {
                people.update(this);
            }
        }
    }

      

      观察者接口,在得到通知者的通知时更新自己。

    //网民类
    public interface People {
        //定义一个更新方法,用于更新状态
        void update(NetworkAnchor networkAnchor);
    }

      

      具体的观察者对象。

    //具体网民类A
    public class PeopleA implements People {
    
        @Override
        public void update(NetworkAnchor networkAnchor) {
            System.out.println(this.getClass().getSimpleName()+ "收到" + networkAnchor.getClass().getSimpleName() + "的消息"); } }
    //具体网民类B
    public class PeopleB implements People {
    
        @Override
        public void update(NetworkAnchor networkAnchor) {
            System.out.println(this.getClass().getSimpleName()+ "收到" + networkAnchor.getClass().getSimpleName() + "的消息"); } }

      

      测试方法,首先创建一个主播类实例,将观察者A,B添加进去,然后发布通知。

    //测试类
    public class Test {
        public static void main(String[] args) {
            NetworkAnchor networkAnchor = new NetworkAnchor();
            networkAnchor.subscribe(new PeopleA());
            networkAnchor.subscribe(new PeopleB());
            networkAnchor.notifyPeople();
        }
    }

    测试结果:

    PeopleA收到NetworkAnchor的消息
    PeopleB收到NetworkAnchor的消息

      总结:当一个对象的改变需要改变其他对象,并且被改变对象不知道其他被改变对象时,我们可以使用观察者模式。并且使用观察者模式分离了观察者与被观察者,降低耦合程度,除此之外,当有其他的网络主播时,我们可以定义一个通知者的接口(这里不再实现),使所有通知者实现这个接口即可。让耦合的双方依赖抽象,符合依赖倒转原则。

  • 相关阅读:
    request:getParameter和getAttribute区别
    JSP登录页面大小
    单例模式详情
    关于HTML的总结
    遍历HashMap的四种方法
    三层开发原则
    java日期
    oracle6
    tomcat
    Linux命令
  • 原文地址:https://www.cnblogs.com/yimengyizhen/p/11121229.html
Copyright © 2011-2022 走看看