`

锈才学设计模式之 —— 观察者模式(Observer Pattern)

阅读更多

锈才学设计模式之  —— 观察者模式 

观察者模式:定义对象的一对多的关系,这样当主题对象改变状态时,其它的观察者对象都会收到通知,自动更新.

 

说明:

       在真实世界中存在很多类似的模型,比如:订报纸,找中介

       订报纸: 你在报社订阅报纸后,你就不用关心怎么获取信息,只要报社有新的信息报纸就会派送给你.

       找中介: 你在中介登记后,你就不用关心怎么找到新房子,中介如果有房源的信息,就会联系你去看房.

这两种都是曲型的对象一对多关系,报社可以有很多订阅者.中介可以有很多登记者.他们就是主题提供者(被观察者),而订阅者和登录者都是观察者.他们依赖于主题,只要主题变化就会被通知.如图:

报社用例

在这里我举一个购物商城商品库存提醒的例子.假如商城的某个商品库存不足时,我们希望能够自动通知展柜把该商品下架,同时自动通知商家补货,我们将该业务的模型图列出:

商品库存通知

示例代码:
    == 商品库存提醒类 == 

package com.jody.pattern.observer;

public class Merchandise {
	private long stock;//库存
	private String id;//商品编号
	/**
	 * 盘点商品库存
	 */
	public void checkStock(){		
		ShowBox.update(id, stock);//展柜下架
		Merchant.update(id, stock);//商家补货		
	}	
}

 

 在这个商品类中,盘点商品库存时,就去将展柜该商品下架,商家补货.这种做法可行,但是有违OO的概念和原则:

  1.应该是面向接口编程,而非面向实现编程.

  2.封装改变的地方,成为单独的类,尽量复用.

  3.各个对象之间尽量低耦合.

按照上面的代码,展柜下架、商家补货都没有独立成单独的类,如果增加一个功能:当商品库存不足时就生成该商品的购买报表,方便数据挖掘小组参考.这时就必须修改商品类的代码以满足功能.这样的话就有局限性,不够弹性.而且展柜下架和商家补货都提供了更新的方法(update),这像是一个统一的接口,应该把它抽象出来。

这时最好就用到观察者模式,重新修改模型如下图:

 

通过使用观察者模式后,对象之间都是松耦合的,主题只知道观察者实现了Observer接口,并不需要知道观察者是什么,要做什么事。任何时候都可以增加新的观察者,因为主题依赖的是一个实现Observer接口的观察者列表,所以可以随时增加观察者,主题不会有任何影响,不需要修改代码,只需要实现Observer接口并注册成观察者。主题状态改变时就会通知他。

设计原则:尽量将交互对象设计成松耦合

 

 示例代码:
    == 主题接口 ==  

package com.jody.pattern.observer;

public interface Subject {
	//注册成观察者
	public void registerObserver(Observer o);
	//注销观察者
	public void removeObserver(Observer o);
	//通知观察者
	public void notifyObserver();
}

  

   == 商品类 ==   

package com.jody.pattern.observer;

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

public class Merchandise implements Subject{
	private List<Observer> observers;
	private long stock;//库存
	private String id;//商品编号
	
	//构造器建立观察者列表
	public Merchandise(){
		observers = new ArrayList<Observer>();
	}
	//盘点商品库存	 
	public void checkStock(){	
		notifyObserver();
	}
	public void notifyObserver() {
		//通知每一个观察者
		for(Observer o:observers){
                                                //o.update(object o)//送数据
			o.update(Merchandise s,stock);//此处把主题传过去,从主题拉数据
		}		
	}
	public void registerObserver(Observer o) {
		//注册观察者
		observers.add(o);		
	}
	public void removeObserver(Observer o) {
		//注销观察者
		int i = observers.indexOf(o);
		if(i>=0){
			observers.remove(i);
		}
	}	
 	public long getStock() {
 		 return stock;
 	}
 	public void setStock(long stock) {
 		 this.stock = stock;
 	}
 	public String getId() {
  		return id;
 	}
 	public void setId(String id) {
  		this.id = id;
 	} 
}

 

  == Observer接口 ==   

package com.jody.pattern.observer;

public interface Observer {
	//更新
	// public void update(String id,long stock);//接受主提送的数据
	public void update(Merchandise s,long stock);//从主题拉数据
}

 

   == 商家观察者 ==

package com.jody.pattern.observer;

public class MerchantObserver implements Observer {
	private Subject subject;
	MerchantObserver(Subject s){
		//构造器中注册自身成观察者
		this.subject = s;
		subject.registerObserver(this);
	}
	/*
	//主题送数据
	public void update(String id, long stock) {
		// 商家补货		
	}*/
	//从主题处拉数据
	public void update(Merchandise s, long stock) {
		// 商家补货	
		s.getId();
		s.getStock();	
	}
}

 

   ==展柜观察者 ==

package com.jody.pattern.observer;

public class ShowBoxObserver implements Observer{
	private Subject subject;
	ShowBoxObserver(Subject s){
		//构造器中注册自身成观察者
		this.subject = s;
		subject.registerObserver(this);
	}
	/*
	//主题送数据
	public void update(String id, long stock) {
		// 商家补货		
	}*/
	//从主题处拉数据
	public void update(Merchandise s, long stock) {
		// 商家补货	
		s.getId();
		s.getStock();	
	}
}

 

   ==测试类 ==

package com.jody.pattern.observer;

public class Test {
	public static void main(String[] args){
		//创建一个商品主题类
		Merchandise subject = new Merchandise();
		//将主题类传给观察者,供观察者注册
		Observer merchant = new MerchantObserver(subject);
		Observer showbox = new ShowBoxObserver(subject);
		//盘点库存,如果库存不足,则通知所有观察者
		subject.checkStock();
	}
}

 

 在商品主题类中可以选择主题送数据通知观察者,也可以提供getter方法,供观察者从主题拉数据,有时观察者不需要所有数据,如果将全部数据通知所有观察者,有点不合规则,所以提供两种方式:送数据、拉数据。

 

在JDK AIP中,已经实现了观察者模式。可以查看JDK查看内置的观察者模式代码:java.util.Observer。在内置的观察者模式中,有一个setChanged()的标记状态,当状态为true时,即通知所有观察者,为falsh不通知。有时候不需要每时每刻都要通知观察者,所以在通知前先设置标记状态,再通知,就可以进行控制。具体的大家可以查看源代码,基本思想是一样的。

  • 大小: 13.9 KB
  • 大小: 13.7 KB
  • 大小: 51.8 KB
分享到:
评论

相关推荐

    设计模式实现——观察者模式

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于实现发布-订阅...

    C#设计模式(17)——观察者模式(Observer Pattern).pdf

    从生活中的例子可以看出,只要对订阅号... 观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己的行为。

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

    "ObserverPattern(订阅模式)3.zip"中的代码可能进一步阐述了观察者模式,这里的“订阅”一词可能意味着用户可以订阅特定的主题,只有当这些主题的状态改变时,用户才会收到通知。这与传统的观察者模式类似,但更加...

    Java设计模式——观察者模式

    其中,观察者模式(Observer Pattern)是一种行为设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,这个主题对象在状态变化时会通知所有观察者,使它们能够自动更新自己。...

    [行为模式]head first 设计模式之观察者模式(observer)

    观察者模式(Observer Pattern)是设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式在软件开发中广泛应用于事件驱动...

    设计模式C++学习之观察者模式(Observer)

    观察者模式(Observer)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。这种模式在C++中广泛应用,特别是在需要...

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

    观察者模式(Observer)是软件设计模式中的一种行为模式,其主要目的是在对象之间建立一种松散耦合的关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式广泛应用于事件驱动...

    深入浅出设计模式二——WeatherData设计(观察者模式)实现一

    在本文中,我们将深入探讨设计模式中的一个经典案例——观察者模式(Observer Pattern),通过具体的实现来理解其工作原理。观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生...

    C++设计模式之观察者模式(Observer)

    观察者模式通常的叫法叫做订阅-发布模式,类似于报刊杂志的订阅,观察者和被观察者就是读者和邮局的关系,读者先要在邮局订阅想要的报刊,当报刊发行时,邮局会将报刊邮寄到读者家里。观察者(Observer)和被观察者...

    详解Observer Pattern(观察者模式)在Java中的使用原理

    我们说学习Java应该从Swing开始,那么学习Swing最重要的思想就是对于观察者模式的理解(Observer Pattern)。因为,该设计模式在Java Swing框架中贯穿了始终。对于C#的委托、代理概念所使用的Callback(回调模式--...

    Android 设计模式:(二)观察者模式 —— 让你的对象知悉现况

    本文将深入探讨其中的一种——观察者模式(Observer Pattern)。观察者模式是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 ### ...

    设计模式代码——c#

    16. 观察者模式(Observer Pattern) 17. 解释器模式(Interpreter Pattern) 18. 中介者模式(Mediator Pattern) 19. 职责链模式(Chain of Responsibility Pattern) 20. 备忘录模式(Memento Pattern) 21. ...

    Android 设计模式:(一)观察者模式 —— 封装行为的大局观

    本文将深入探讨其中的一种——观察者模式(Observer Pattern),它是行为设计模式的一种,主要用来封装行为的变化,实现对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被...

    深入浅出设计模式二——WeatherData设计(观察者模式)实现二

    在本文中,我们将深入探讨设计模式中的"观察者模式",并以`WeatherData`为例进行具体实现。观察者模式是一种行为设计模式,它允许我们定义一个订阅机制,当对象状态发生变化时,可以通知所有依赖它的观察者。这种...

    设计模式-观察者

    观察者模式(Observer Pattern)是行为设计模式的一种,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。 观察者模式的核心思想是发布-订阅模型,其中...

    设计模式--观察者模式java例子

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于事件驱动的系统或者...

    设计模式之观察者模式Java实现

    观察者模式(Observer Pattern)是软件设计模式中的一种行为模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。这种模式常用于事件驱动的系统或者...

Global site tag (gtag.js) - Google Analytics