码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式--观察者模式

时间:2020-02-22 14:13:37      阅读:82      评论:0      收藏:0      [点我收藏+]

标签:效率   一个   pattern   reg   很多   ring   ret   pre   dem   

观察者模式

定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。

核心:观察者模式主要作用于1:N的通知。当一个对象(目标对象Subject或Objservable)的状态变化时,他需要及时告知一系列对象(观察者对象Observer),令他们做出响应。通知观察者的方式:

1)推:每次都会把通知以广播方式发送给所有观察者,所有观察者只能被动接收

2)拉:观察者只要直到有情况即可。至于什么时候获取内容,获取什么内容,都可以自主决定

角色

1)抽象主题(Subject)角色:也叫抽象目标类,它提供了一个用于保存观察者对象的聚集类和增加、删除观察者对象的方法,以及通知所有观察者的抽象方法。

2)具体主题(Concrete    Subject)角色:也叫具体目标类,它实现抽象目标中的通知方法,当具体主题的内部状态发生改变时,通知所有注册过的观察者对象。

3)抽象观察者(Observer)角色:它是一个抽象类或接口,它包含了一个更新自己的抽象方法,当接到具体主题的更改通知时被调用。

4)具体观察者(Concrete Observer)角色:实现抽象观察者中定义的抽象方法,以便在得到目标的更改通知时更新自身的状态。

图示:技术图片

 

package com.offcn.designpattern.observerpattern;

import java.util.ArrayList;
import java.util.List;

public class ObserverpatternDemo {
    public static void main(String[] args) {
        ConcreteSubject subject = new ConcreteSubject();
        ObserverA o1 = new ObserverA();
        ObserverA o2 = new ObserverA();
        ObserverA o3 = new ObserverA();
        subject.registObserver(o1);
        subject.registObserver(o2);
        subject.registObserver(o3);
        subject.setState(1000);
        System.out.println(o1.getMyState());
        System.out.println(o2.getMyState());
        System.out.println(o3.getMyState());
        System.out.println("============================");
        subject.setState(200);
        System.out.println(o1.getMyState());
        System.out.println(o2.getMyState());
        System.out.println(o3.getMyState());
    }
}
interface Observer{
    void update(Subject subject);
}
class ObserverA implements Observer{
    private int myState;

    @Override
    public void update(Subject subject) {
       myState =  ((ConcreteSubject)subject).getState();
    }

    public int getMyState() {
        return myState;
    }

    public void setMyState(int myState) {
        this.myState = myState;
    }
}
class Subject{
    protected List<Observer> list = new ArrayList<Observer>();
    public void registObserver(Observer observer){
        list.add(observer);
    }
    public void removeObserver(Observer observer){
        list.remove(observer);
    }
    public void notifyAllObservers(){
        for (Observer observer : list) {
            observer.update(this);
        }
    }
}
class ConcreteSubject extends Subject{
    private int state;

    public int getState() {
        return state;
    }

    public void setState(int state) {
        this.state = state;
        this.notifyAllObservers();
    }

}

输出:

技术图片

 

 

优点

1)降低了目标与观察者之间的耦合关系,两者之间是抽象耦合关系。

2)目标与观察者之间建立了一套触发机制。

缺点

1)目标与观察者之间的依赖关系并没有完全解除,而且有可能出现循环引用。

2)当观察者对象很多时,通知的发布会花费很多时间,影响程序的效率。

应用场景

1)对象间存在一对多关系,一个对象的状态发生改变会影响其他对象。

2)当一个抽象模型有两个方面,其中一个方面依赖于另一方面时,可将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。

3)Servlet中监听器的实现。Android中广播机制

 

设计模式--观察者模式

标签:效率   一个   pattern   reg   很多   ring   ret   pre   dem   

原文地址:https://www.cnblogs.com/bai3535/p/12344893.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!