zoukankan      html  css  js  c++  java
  • 设计模式 观察者模式(Observer)

    设计模式 观察者模式(Observer)

    @author ixenos

     

    观察者模式是什么


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

    观察者模式组成


    抽象主题角色:把所有观察者对象的引用保存在一个集合中,每个抽象主题角色都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类或接口来实现。

    具体主题角色:在具体主题内部状态改变时,给所有登记过的观察者发出通知。具体主题角色通常由一个子类实现。

    抽象观察角色:为所有具体的观察者定义一个更新接口,在得到主题的通知时更新自己。

    具体观察角色:该角色实现抽象观察角色所要求的更新接口,以便使本身的状态与主题的状态相协调。如果需要,具体观察角色可以保存一个指向具体主题角色的引用。通常由一个子类实现。

    抽象观察角色:

    1 public interface AbstractWatcher{
    2     public void update();
    3 }

    具体观察角色

    1 public class ConcreteWatcher implements AbstractWatcher{
    2     @Override
    3     public void update(){
    4         System.out.println("Watcher update.");
    5     }
    6 }

    抽象主题角色

    1 public interface AbstractWatched{
    2     public void addWatcher(AbstractWatcher watcher);
    3     
    4     public void removeWatcher(AbstractWatcher watcher);
    5 
    6     public void removeAllWatchers();
    7 
    8     public void changeStatus();
    9 }

    具体主题角色

     1 import java.util.ArrayList;
     2 import java.util.List;
     3 
     4 public class ConcreteWatched implements AbstractWatched{
     5     private List<AbstractWatched> list = new ArrayList<>();
     6 
     7     @Override
     8     public void addWatcher(AbstractWatched watcher){
     9         list.add(watcher);
    10     }
    11 
    12     @Override
    13     public void removeWatcher(AbstractWatched watcher){
    14         list.remove(watcher);
    15     }
    16 
    17     @Override
    18     public void removeAllWatchers(){
    19         list.clear();
    20     }
    21 
    22     @Override
    23     public void changeStatus(){
    24         System.out.println("Status changed");
    25 
    26         for(AbstractWatcher watcher : list){
    27             watcher.update();
    28         }
    29     }
    30 }

    客户端

     1 public class Client{
     2     public static void main(String[] args){
     3 
     4         //定义一个主题角色
     5         AbstractWatched watched = new ConcreteWatched();
     6 
     7         //定义三个观察者角色
     8         AbstractWatcher watcher1 = new AbstractWatcher();
     9         AbstractWatcher watcher2 = new AbstractWatcher();
    10         AbstractWatcher watcher3 = new AbstractWatcher();
    11 
    12         //添加观察者到主题当中
    13         watched.addWatcher(watcher1);
    14         watched.addWatcher(watcher2);
    15         watched.addWatcher(watcher3);
    16 
    17         //主题角色改变,触发观察者改变
    18         watched.changeStatus();
    19 
    20         watched.removeWatcher(watcher2);
    21         watched.changeStatus();
    22 
    23         watched.removeAllWatchers();
    24         watched.changeStatus();
    25 
    26     }
    27 }
  • 相关阅读:
    “介绍一下自己吧”——记2020BUAA软工团队介绍和采访
    [no code][scrum meeting] Alpha 7
    [no code][scrum meeting] Alpha 6
    [no code][scrum meeting] Alpha 5
    [no code][scrum meeting] Alpha 4
    [no code][scrum meeting] Alpha 3
    [no code][scrum meeting] Alpha 2
    [no code][scrum meeting] Alpha 1
    [no_code]团队贡献分分配规则
    [no_code]团队任务拆解Alpha
  • 原文地址:https://www.cnblogs.com/ixenos/p/5813176.html
Copyright © 2011-2022 走看看