首页 > 代码库 > 【设计模式】—— 观察者模式Observer

【设计模式】—— 观察者模式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 updateConcreteObserver2 updateConcreteObserver3 update
ConcreteObserver1 updateConcreteObserver3 update

 

【设计模式】—— 观察者模式Observer