zoukankan      html  css  js  c++  java
  • 【设计模式】—— 观察者模式Observer

      前言:【模式总览】——————————by xingoo

      模式意图

      观察者模式,也叫发布/订阅模式,从名字来说就能察觉到它的过程应该是,发布——其他人接受。

      这个模式定义了对象之间的一种依赖关系,当一个对象发生变化时,其他的对象收到更新,也发生变化

      模拟我们订阅邮件这个场景,不管我们的邮箱是在登陆还是关闭,邮件都会发送到邮箱里面。只要把自己的邮箱订阅到这个邮件就可以了!这个模式也是这样一个过程。

      这个模式代码相对来说比较容易理解,而且应用很广泛。

      应用场景

      1 当一个模型有几个展现方面,通过修改一个展现,顺便更新其他的。就好比一个网站的有web端,也有移动端,当web端的数据发生变化时,移动端的数据展现也要更新。

      2 对一个对象发生改变,而不知道将有多少对象会发生改变时,利用这种模式可以有效的管理对象。

      模式结构

      Subject 抽象的主题角色

    interface Subject{
        public void attach(Observer observer);
        public void detach(Observer observer);
        void notifyObservers();
    }

      ConcreteSubject 具体的主题角色,内部有一个容易,用于存放订阅者

    class ConcreteSubject implements Subject{
        List<Observer> list = new ArrayList();
        public void attach(Observer observer) {
            list.add(observer);
        }
        public void detach(Observer observer) {
            list.remove(observer);
        }
        public void notifyObservers() {
            for(Observer o : list){
                o.update();
            }
        }
    }

      Observer 抽象的订阅者角色

    interface Observer{
        public void update();
    }

      ConcreteObserver 具体的订阅者

    class ConcreteObserver1 implements Observer{
        public void update() {
            System.out.println("ConcreteObserver1 update");
        }
    }
    class ConcreteObserver2 implements Observer{
        public void update() {
            System.out.println("ConcreteObserver2 update");
        }
    }
    class ConcreteObserver3 implements Observer{
        public void update() {
            System.out.println("ConcreteObserver3 update");
        }
    }

      全部代码

     1 package com.xingoo.test.design.observer;
     2 
     3 import java.util.ArrayList;
     4 import java.util.List;
     5 
     6 interface Subject{
     7     public void attach(Observer observer);
     8     public void detach(Observer observer);
     9     void notifyObservers();
    10 }
    11 class ConcreteSubject implements Subject{
    12     List<Observer> list = new ArrayList();
    13     public void attach(Observer observer) {
    14         list.add(observer);
    15     }
    16     public void detach(Observer observer) {
    17         list.remove(observer);
    18     }
    19     public void notifyObservers() {
    20         for(Observer o : list){
    21             o.update();
    22         }
    23     }
    24 }
    25 interface Observer{
    26     public void update();
    27 }
    28 class ConcreteObserver1 implements Observer{
    29     public void update() {
    30         System.out.println("ConcreteObserver1 update");
    31     }
    32 }
    33 class ConcreteObserver2 implements Observer{
    34     public void update() {
    35         System.out.println("ConcreteObserver2 update");
    36     }
    37 }
    38 class ConcreteObserver3 implements Observer{
    39     public void update() {
    40         System.out.println("ConcreteObserver3 update");
    41     }
    42 }
    43 public class Client {
    44     public static void main(String[] args) {
    45         Subject subject = new ConcreteSubject();
    46         Observer o1 = new ConcreteObserver1();
    47         Observer o2 = new ConcreteObserver2();
    48         Observer o3 = new ConcreteObserver3();
    49         subject.attach(o1);
    50         subject.attach(o2);
    51         subject.attach(o3);
    52         subject.notifyObservers();
    53         
    54         subject.detach(o2);
    55         subject.notifyObservers();
    56     }
    57 }
    View Code

      运行结果

    ConcreteObserver1 update
    ConcreteObserver2 update
    ConcreteObserver3 update
    ConcreteObserver1 update ConcreteObserver3 update
  • 相关阅读:
    端口
    IDEA 快捷建
    Correct the classpath of your application so that it contains a single, compatible version of javax.
    Consider renaming one of the beans or enabling overriding by setting
    Idea 关于SpringBoot的@AutoWired 注入问题--无法自动装配Could not autowire. No beans of 'UserMapper' type found. more...
    数据库相关问题
    Initialization failed for 'https://start.spring.io' Please check URL, network and proxy settings. E
    爬虫
    CMS总结
    rust 打印当前时间
  • 原文地址:https://www.cnblogs.com/xing901022/p/4084748.html
Copyright © 2011-2022 走看看