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

      观察者模式也是 发布-订阅模式。它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。当这个主题对象在状态发生变化的时候,会通知所有观察者对象,使他们能够自动更新自己。

      观察者模式主要包括以下几个角色:

      1、Subject(抽象主题角色)

      2、ConcreteSubject(具体的主题角色):它会存有所有观察者的引用,以便于及时通知他们。

      3、Observer(抽象观察者角色)

      4、ConcreteObserver(具体的观察者)

      下面就直接上代码:

      1、先定义抽象主题角色:包括注册观察者和移除观察者,以及通知观察者

    package com.hd.observer;
    
    public interface Observable {
    
        void registerObserver(Observer observer);
        void removeObserver(Observer observer);
        void notifyAllObservers();
    }

      2、具体观察者

    package com.hd.observer;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class WechatServer implements Observable {
    
        private List<Observer> observers = new ArrayList<Observer>();
        private String msg;
        
        @Override
        public void registerObserver(Observer observer) {
            observers.add(observer);
        }
        
        @Override
        public void removeObserver(Observer observer) {
            observers.remove(observer);
        }
        
        @Override
        public void notifyAllObservers() {
            
            for(Observer observer: observers){
                observer.update(msg);
            }
        }
        
        public void setInformation(String msg){
            System.out.println("wechat push message: "+ msg);
            this.msg = msg;
            notifyAllObservers();  //状态改变的时候,同时触发通知观察者
        }
    }

      3、抽象观察者。 它会有一个update方法,用来接收主题角色的通知

    package com.hd.observer;
    
    public interface Observer {
        void update(String msg);    //接收主题角色的通知
    }

      4、具体的观察者

    package com.hd.observer;
    
    public class ConcreteObserver implements Observer {
    
        private String name;
        public ConcreteObserver(String name) {
            this.name = name;
        }
        
        @Override
        public void update(String msg) {
            System.out.println(name + " receive message: " + msg);
            
        }
    }

      5、下面测试一下:

    package com.hd.observer;
    
    public class TestObserver {
    
        public static void main(String[] args) {
            
            ConcreteObserver o1 = new ConcreteObserver("jack");
            ConcreteObserver o2 = new ConcreteObserver("jet");
            ConcreteObserver o3 = new ConcreteObserver("tony");
            
            WechatServer server = new WechatServer();
            server.registerObserver(o1);
            server.registerObserver(o2);
            server.registerObserver(o3);
            server.setInformation("java is the world best language");
    System.
    out.println("------------------------------");
    server.removeObserver(o1); server.setInformation(
    "python is the world best language"); } }

      

      看下测试结果:

    wechat push message: java is the world best language
    jack receive message: java is the world best language
    jet receive message: java is the world best language
    tony receive message: java is the world best language
    ------------------------------
    wechat push message: python is the world best language
    jet receive message: python is the world best language
    tony receive message: python is the world best language

      未完待续。。。

  • 相关阅读:
    Python tutorial阅读之基本数据结构
    Leetcode:Merge Sorted Array
    Python tutorial阅读之函数的定义与使用
    LeetCode:3Sum
    Python tutorial阅读之Python基本运算与基本变量
    Python tutorial阅读之使用 Python 解释器
    LeetCode:Longest Substring Without Repeating Characters
    如何过好幸福且富裕的一生----查理芒格
    创业学习---《调研黑客上:锁定调研目标》--D-2.调研模块---HHR计划---以太一堂
    创业学习---《如何展开竞争情报调研》--D-1.调研模块---HHR计划---以太一堂
  • 原文地址:https://www.cnblogs.com/xiexin2015/p/9060573.html
Copyright © 2011-2022 走看看