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

    一、观察者模式简介

      观察者模式(有时又被称为发布-订阅Subscribe>模式、模型-视图View>模式、源-收听者Listener>模式或从属者模式)是软件设计模式的一种。观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,让他们能够自动更新自己。

      观察者模式的组成:

    • 抽象主题角色:把所有对观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类或接口来实现。
    • 抽象观察者角色:为所有具体的观察者定义一个接口,在得到主题的通知时更新自己。
    • 具体主题角色:在具体主题内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常用一个子类实现。
    • 具体观察者角色:该角色实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。如果需要,具体观察者角色可以保存一个指向具体主题角色的引用。通常用一个子类实现

      观察者模式的UML图如下:

     

    二、观察者模式实现

      1、创建Watched接口(抽象主题角色)

     1 package com.test.observer;
     2 
     3 /**
     4  * 抽象主题角色
     5  */
     6 public interface Watched {
     7     public void addWatcher(Watcher watcher);
     8 
     9     public void removeWatcher(Watcher watcher);
    10 
    11     public void notifyWatchers(String str);
    12 }

      2、创建Watcher接口(抽象观察者角色)

    1 package com.test.observer;
    2 
    3 /**
    4  * 抽象观察者角色
    5  */
    6 public interface Watcher {
    7     public void update(String str);
    8 }

      3、创建ConcreteWatched类(具体主题角色)

     1 package com.test.observer;
     2 
     3 import java.util.ArrayList;
     4 import java.util.List;
     5 
     6 /**
     7  * 具体主题角色
     8  */
     9 public class ConcreteWatched implements Watched {
    10     // 用来保存观察者
    11     private List<Watcher> list = new ArrayList<Watcher>();
    12 
    13     // 添加观察者
    14     public void addWatcher(Watcher watcher) {
    15         list.add(watcher);
    16     }
    17 
    18     // 删除观察者
    19     public void removeWatcher(Watcher watcher) {
    20         list.remove(watcher);
    21     }
    22 
    23     // 通知所有观察者
    24     public void notifyWatchers(String str) {
    25         for (Watcher watcher : list) {
    26             watcher.update(str);
    27         }
    28     }
    29 
    30 }

      4、创建ConcreteWatcher类(具体观察角色)

    package com.test.observer;
    
    /**
     * 具体观察者角色
     */
    public class ConcreteWatcher implements Watcher {
        public void update(String str) {
            System.out.println(str);
        }
    
    }

      5、调用类

     1 package com.test.observer;
     2 
     3 public class Test {
     4     public static void main(String[] args) {
     5         Watched girl = new ConcreteWatched();
     6 
     7         Watcher watcher1 = new ConcreteWatcher();
     8         Watcher watcher2 = new ConcreteWatcher();
     9         Watcher watcher3 = new ConcreteWatcher();
    10 
    11         girl.addWatcher(watcher1);
    12         girl.addWatcher(watcher2);
    13         girl.addWatcher(watcher3);
    14 
    15         girl.notifyWatchers("开心,爽");
    16 
    17         girl.removeWatcher(watcher2);
    18 
    19         girl.notifyWatchers("不爽");
    20 
    21     }
    22 }

      运行结果如下图所示:

  • 相关阅读:
    ovs tag
    从数据库分析OpenStack创建虚机流程
    Neutron中的二层网络服务架构
    Failed to bind port
    OpenStack网络参数segment
    OpenStack与SDN控制器的集成
    HDU 3709 Balanced Number
    HDU 5787 K-wolf Number
    HDU 5803 Zhu’s Math Problem
    CodeForces 258B Little Elephant and Elections
  • 原文地址:https://www.cnblogs.com/always-online/p/3531334.html
Copyright © 2011-2022 走看看