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

观察者模式

时间:2019-07-28 12:11:42      阅读:103      评论:0      收藏:0      [点我收藏+]

标签:over   one   array   结果   rgs   ted   detach   统一   模式   

 

一、观察者模式

观察者模式又叫发布-订阅模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时会通知所有的观察者对象,使它们能够自动地更新自己。当一个对象的改变需要改变其他的对象的时候就可以用观察者模式。

二、结构图

技术图片

Subject类是抽象的主题对象,也是抽象通知者,可以从Observer观察者对象引用的聚集里面添加或者删除;

Observer类是抽象观察者,在得到主题的通知时更新自己。

三、示例

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

//抽象通知者
abstract class Subject{
    List<Observer> observers=new ArrayList<>();
    //增加观察者
    protected void attach(Observer observer){
        observers.add(observer);
    }
    //移除观察者
    protected void detach(Observer observer){
        observers.remove(observer);
    }
    //进行通知
    protected void notifying(){
        for (Observer o :observers) {
            o.update();
        }
    }
}
//抽象观察者
abstract class Observer{
    abstract void update();
}

//具体通知者,将有关状态存入具体观察者对象,
// 在具体主题的内部状态改变时,给所有登记过的观察者发出通知。
class ConcreteSubject extends Subject{
    private String subjectState;
    //具体被观察者状态

    public String getSubjectState() {
        return subjectState;
    }

    public void setSubjectState(String subjectState) {
        this.subjectState = subjectState;
    }
}

//具体观察者
class ConcreteObserver extends Observer{
    private String name;
    private String observerState;
    private ConcreteSubject subject;
    
    public ConcreteObserver(ConcreteSubject subject,String name){
        this.subject=subject;
        this.name=name;
    }
    
    @Override
    void update() {
        observerState=subject.getSubjectState();
        System.out.println("观察者"+name+"的状态:"+observerState);
    }
}


public class ObserverPattern {
    public static void main(String[] args) {
        ConcreteSubject s=new ConcreteSubject();
        s.attach(new ConcreteObserver(s,"one"));
        s.attach(new ConcreteObserver(s,"two"));
        s.attach(new ConcreteObserver(s,"three"));
    
        s.setSubjectState("ABC");
        s.notifying();
    }
}

输出结果:

技术图片

四、观察者模式的不足

可以从上面的梳理中发现一些问题,

首先,抽象的观察者和抽象的通知者还是耦合的,那如果缺少通知者或者观察者的抽象类,那就无法完成工作了呀;

另外,观察者可能不一定是是更新状态这些抽象类中统一的操作,可能还会进行一些其他的操作,

这些是需要改进的问题。

 

观察者模式

标签:over   one   array   结果   rgs   ted   detach   统一   模式   

原文地址:https://www.cnblogs.com/chen-ying/p/11258386.html

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