观察者模式 订阅
观察者模式(有时又被称为模型(Model)-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。 展开全文
观察者模式(有时又被称为模型(Model)-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。
信息
模    式
软件设计模式
外文名
Observer Mode
又称为
发布-订阅模式
中文名
观察者模式
系    统
通常被用来实现事件处理系统
观察者模式基本介绍
观察者模式是一种对象行为模式。它定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。在观察者模式中,主题是通知的发布者,它发出通知时并不需要知道谁是它的观察者,可以有任意数目的观察者订阅并接收通知。观察者模式不仅被广泛应用于软件界面元素之间的交互,在业务对象之间的交互、权限管理等方面也有广泛的应用。 [1]  观察者模式(Observer)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。观察者设计模式定义了对象间的一种一对多的组合关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。
收起全文
精华内容
下载资源
问答
  • 设计模式-观察者模式

    万次阅读 2019-12-08 09:50:12
    知识点1:什么是观察者模式 知识点2:模式的职责 知识点3:模式的实现 知识点4:应用场景 知识点1:什么是观察者模式 观察者模式(Observer),是一种行为性模型,行为型模式关注的是系统中对象之间的相互交互,解决...

    目录

    知识点1:什么是观察者模式

    知识点2:模式的职责

    知识点3:模式的实现

    知识点4:应用场景


    知识点1:什么是观察者模式

    观察者模式(Observer),是一种行为性模型,行为型模式关注的是系统中对象之间的相互交互,解决系统在运行时对象之间的相互通信和协作,进一步明确对象的职责。相比来说,创建型模式关注对象的创建过程,结构型模式关注对象和类的组合关系。


    知识点2:模式的职责

    观察者模式主要用于1对N的通知。当一个对象的状态变化时,他需要及时告知一系列对象,令他们做出相应。

    实现有两种方式:

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

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


    知识点3:模式的实现

    //观察者的接口,用来存放观察者共有方法
    public interface Observer {
       // 观察者方法
    	void update(Subjecct subjecct);
    }
    
    //观察对象的父类
    public class Subjecct {
    	//观察者的存储集合
    	private List<Observer> list = new ArrayList<>();
    
    	// 注册观察者方法
    	public void registerObserver(Observer obs) {
    		list.add(obs);
    	}
        // 删除观察者方法
    	public void removeObserver(Observer obs) {
    		list.remove(obs);
    		this.notifyAllObserver();
    	}
    
    	// 通知所有的观察者更新
    	public void notifyAllObserver() {
    		for (Observer observer : list) {
    			observer.update(this);
    		}
    	}
    
    }
    //具体观察者对象的实现
    public class RealObserver extends Subjecct {
        //被观察对象的属性
    	 private int state;
    	 public int getState(){
    		 return state;
    	 }
    	 public void  setState(int state){
    		 this.state=state;
    		 //主题对象(目标对象)值发生改变
    		 this.notifyAllObserver();
    	 }
    	
    }
    public class Client {
    
    	public static void main(String[] args) {
    		// 目标对象
    		RealObserver subject = new RealObserver();
    		// 创建多个观察者
    		ObserverA obs1 = new ObserverA();
    		ObserverA obs2 = new ObserverA();
    		ObserverA obs3 = new ObserverA();
    		// 注册到观察队列中
    		subject.registerObserver(obs1);
    		subject.registerObserver(obs2);
    		subject.registerObserver(obs3);
    		// 改变State状态
    		subject.setState(300);
    		System.out.println(obs1.getMyState());
    		System.out.println(obs2.getMyState());
    		System.out.println(obs3.getMyState());
    		// 改变State状态
    		subject.setState(400);
    		System.out.println(obs1.getMyState());
    		System.out.println(obs2.getMyState());
    		System.out.println(obs3.getMyState());
    	}
    
    }
    

    知识点4:应用场景

    关联行为场景,需要注意的是,关联行为是可拆分的,而不是“组合”关系。

    事件多级触发场景。

    跨系统的消息交换场景,如消息队列、事件总线的处理机制。

     

     

    展开全文
  • 观察者模式

    千次阅读 2017-04-13 20:27:28
    观察者模式

    这篇博客主要总结一下观察者模式。


    观察者模式应该算是众多设计模式中,
    应用比较广,同时也比较好理解的模式了。

    因此这里直接给出它的定义:
    观察者模式定义了对象之间的一对多依赖,
    这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

    SouthEast

    观察者模式的思想基本上可以用上图来说明。

    有状态的对象将作为消息发布者,
    负责将状态变化的信息通知给观察者们。

    如图所示:
    加入了订阅组的用户就是消息发布者的观察者,
    它们会在必要时收到通知消息。

    没有加入订阅组的用户4,不会收到通知信息。

    用户可以自由的加入和离开订阅组。

    这个过程,就像你在新闻APP中订阅某个专题一样。
    如果你订阅了该专题,
    那么有该专题的新闻出现时,就会主动推送给你。
    如果某天你对该专题没兴趣了,
    就可以取消订阅,此时就不会收到任何推送新闻了。


    接下来,我们看看观察者模式相关的类图:
    SouthEast

    如上图所示,主题只需要知道观察者实现了Observer接口,而不需要知道其它的细节。
    因此实际的主题对象,例如图中的ConcreteSubject对象,只需要将观察者当作Observer保存。

    同理,观察者也不需要知道主题的实现细节,只需要知道主题实现了Subject接口。
    通过Subject中的registerObserver接口,观察者可以将自己注册到主题;
    通过removeObserver接口,观察者可以取消对主题的关注。

    当主题发现状态改变时,就可以调用notifyObserver方法,调用保存的所有观察者的update函数。

    此外,主题对象还可以提供getState和setState方法,供其它对象主动获取或设置主题的状态。

    通过上图可以看出,整个观察者模式提供了一种松耦合的设计。
    主题和观察者之间可以交互,但不需要清楚彼此的细节。
    只要遵循它们之间定义的接口,那么改变主题或观察者其中一方,并不会影响另一方。


    最后,我们来看看Android源码中使用观察者模式的例子。

    Android中使用观察者模式的地方很多,此处我们以RIL的通知框架为例。
    SouthEast

    如图所示,RIL接收modem上报的信息,作为整个通知框架的消息发布者,即主题。
    RIL继承BaseCommands类,后者实现了CommandsInterface接口。

    CommandsInterface接口中定义了许多注册、反注册函数,这里以RadioState相关的函数为例。
    ServiceStateTracker作为观察者,需要将自己的Handler等参数注册到主题中。

    主题将利用利用这些参数构造出Registrant对象,
    并保存到BaseCommands中的mRadioStateChangedRegistrants中。

    当RadioState发生变化时,BaseCommands就会通知mRadioStateChangedRegistrants中的所有Registrant。
    Registrant就会利用自身的Handler发送消息给实际的观察者ServiceStateTracker。

    RIL通知框架的类图与上文提到的观察者模式类图基本一致,
    唯一的区别是观察者并没有继承接口对象,而是将Handler注册到主题中。
    考虑到Handler在Android中的普及程度,实质上这也可以看作一种针对“接口”的编程。

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 36,512
精华内容 14,604
关键字:

观察者模式