简说观察者模式

>>强大,10k+点赞的 SpringBoot 后台管理系统竟然出了详细教程!

设计模式之观察者模式

定义

观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。 —— [ 百度百科 ]

解释说明

在观察者模式中,简化为观察者角色和被观察者角色。当被观察者发生变化时,观察者能及时检测到这种变化,并相应的做出反应。换句话说:当被观察者发生改变时,由被观察者通知观察者,让观察者做出相应的应对。

代码块
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
//抽象观察者
    interface Observer{
        public void say();
    }
    //具体观察者A
    class ObserverA implements Observer{
        public ObserverA (String name) {
            this.name = name;
        }
        @Override
        public void say() {
            System.out.println(name + "检测到了变化");            
        }
        private String name;        
    }
    //具体观察者B
    class ObserverB implements Observer{
        public ObserverB (String name) {
            this.name = name;
        }
        @Override
        public void say() {
            System.out.println(name + "检测到了变化");            
        }
        private String name;        
    }
    //具体观察者C
    class ObserverC implements Observer{
        public ObserverC (String name) {
            this.name = name;
        }
        @Override
        public void say() {
            System.out.println(name + "检测到了变化");            
        }
        private String name;        
    }
    //抽象被观察者
    interface Subject{
        public void update();
    }
    //具体被观察者
    class SubjectA implements Subject{
 
        public List<Observer> observer = new ArrayList<Observer>(); 
 
        @Override
        public void update() {
            for (Observer model : observer) {
                model.say();
            }           
        }       
    }
    //测试
    public static void main(String[] args) {
        //创建观察者
        Observer observerA = new Test().new ObserverA("观察者A");
        Observer observerB = new Test().new ObserverB("观察者B");
        Observer observerC = new Test().new ObserverC("观察者C");
        //创建被观察者
        SubjectA subjectA = new Test().new SubjectA(); 
        subjectA.observer.add(observerA);
        subjectA.observer.add(observerB);
        subjectA.observer.add(observerC);
        subjectA.update();      
    }
}

: 以上就是观察者模式的完整代码。在上述代码中,我们分别对观察者与被观察者抽象出各自的父类,这一步仅仅是为了体现java的多态,方便扩展。被观察者中,我们内置了一个观察者的list集合,这里存储跟被观察者相关联的观察者对象,当被观察者发生变化时,则循环遍历观察者集合,调用各个观察者的对应方法。这种观察者模式,在java中已经内置了实现,大家可以自行查阅。

总结

举一个例子:网站开发中,web页面就是我们的观察者,页面上展示的数据来自于数据库,当数据库中这些数据发生改变时,我们的页面监视到这一变化,然后做出响应,重新加载页面数据,保持跟数据库内容一致。

优点
  1. 观察者和被观察者是抽象耦合的。
  2. 建立一套触发机制。
缺点
  1. 如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
  2. 如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。
  3. 观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。