`

设计模式:观察者模式(Observer Patterns)

阅读更多

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

 

开发步骤:两种方法(这里我们假设自己是一个气象站,为移动设备提供天气数据)

一、使用自己的观察者模式

1>新建一个主题接口Subject和一个观察者接口Observer

 

<1>主题接口:新建三个方法,Subject.java

 

package com.kaishengit;

public interface Subject {
	public void registerObserver(Observer observer);//用于注册观察者
	public void removeObserver(Observer observer);//用于移除观察者
	public void notifyObserver();//用于通知观察者
}
 

 

<2>观察者接口:新建一个方法update

Observer.java

 

 

package com.kaishengit;

public interface Observer {
	public void update(int low,int height,String weather);//更新数据时调用
}
 

 

2>新建一个主题类:实现主题接口;

新建两个观察者:分别实现观察者接口

<1>主题类:WeacherData.java 

 

package com.kaishengit;

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

public class WeacherData implements Subject{
	
	private int low;//低温数据
	private int height;//高温数据
	private String weather;//天气情况
	private List<Observer> observerList = new ArrayList<Observer>();//用于存储观察者
	
	/**
	 * 设置气象数据
	 * @param low
	 * @param height
	 * @param weather
	 */
	public void setData(int low,int height,String weather){
		this.low = low;
		this.height = height;
		this.weather = weather;
		change();
	}
	
	/**
	 * 数据改变时,调用此方法
	 */
	public void change(){
		notifyObserver();
	}
	
	/**
	 * 通知所有观察者
	 */
	@Override
	public void notifyObserver() {
		for(Observer o : observerList){
			//更新所有观察者(实现观察者接口:Observer)的数据
			o.update(getLow(), getHeight(), getWeather());
		}
	}

	@Override
	public void registerObserver(Observer observer) {
		if(!observerList.contains(observer)){
			observerList.add(observer);
		}
	}

	@Override
	public void removeObserver(Observer observer) {
		if(observerList.contains(observer)){
			observerList.remove(observer);
		}
	}
	
	
	//get
	public int getLow() {
		return low;
	}
	public int getHeight() {
		return height;
	}
	public String getWeather() {
		return weather;
	}
	
}
 

 

<2>新建两个观察者

(1)、观察者移动设备:Android

 

package com.kaishengit;

/**
 * 实现观察者接口
 * @author emomeild
 *
 */
public class Android implements Observer{
	private Subject subject;
	public Android(){
		
	}
	
	/**
	 * 注册此观察者
	 * @param subject
	 */
	public Android(Subject subject){
		this.subject = subject;
		subject.registerObserver(this);
	}
	
	/**
	 * 用于显示数据
	 * @param low
	 * @param height
	 * @param weather
	 */
	public void display(int low,int height,String weather){
		System.out.println("Android显示:→" + "低温:" + low + "\t高温:" + height + "\t天气:" + weather);
	}

	/**
	 * 接口中方法,用于更新数据
	 */
	@Override
	public void update(int low, int height, String weather) {
		display(low, height, weather);
	}
	
	/**
	 * 移除此观察者
	 */
	public void removeObserver(){
		subject.removeObserver(this);
	}
}

 

 (2)观察者移动设备:Iphone

 

package com.kaishengit;

public class Iphone implements Observer{
	private Subject subject;
	public Iphone(){}
	
	public Iphone(Subject subject){
		this.subject = subject;
		subject.registerObserver(this);
	}
	
	public void display(int low,int height,String weather){
		System.out.println("Iphone显示:→" +  "低温:" + low + "\t高温:" + height + "\t天气:" + weather);
	}

	@Override
	public void update(int low, int height, String weather) {
		display(low, height, weather);
	}
	
	public void removeObserver(){
		subject.removeObserver(this);
	}
}

 

 这里还可以添加新的观察者,例如:Ipad...

<3>一切Ok,现在我们新建一个测试类:

 

package com.kaishengit;

public class Test {
	public static void main(String[] args) {
		WeacherData wd = new WeacherData();
		
		Android android = new Android(wd);
		android.removeObserver();//移除此观察者
		
		Iphone iphone = new Iphone(wd);
		
		wd.setData(12, 23, "晴朗");
	}
}

 运行结果:

Iphone显示:→低温:12 高温:23 天气:晴朗

 

 

二、使用Java中内置的观察者模式

1>新建一个主题类WeatherData:继承java中Observable类

 

package com.kaishengit.java;

import java.util.Observable;

public class WeatherData extends Observable{
	private int low;
	private int height;
	private String weather;
	
	public void setData(int low,int height,String weather){
		this.low = low;
		this.height = height;
		this.weather = weather;
		change();
	}
	
	public void change(){
		setChanged();
		notifyObservers(new Object[]{getLow(),getHeight(),getWeather()});//可以传参数
	}
	
	public int getLow() {
		return low;
	}
	public int getHeight() {
		return height;
	}
	public String getWeather() {
		return weather;
	}
	
	
}

 

 2>新建观察者:实现java中Observer接口

<1>、观察者移动设备:Android

 

package com.kaishengit.java;

import java.util.Observable;
import java.util.Observer;

public class Android implements Observer{
	
	private Observable observable;
	
	public Android(){};
	public Android(Observable observable){
		this.observable = observable;
		observable.addObserver(this);
	}
	
	public void display(int low,int height,String weather){
		System.out.println("Android显示:→" + "低温:" + low + "\t高温:" + height + "\t天气:" + weather);
	}

	@Override
	public void update(Observable o, Object arg) {
		WeatherData wd = (WeatherData) o;//不使用传递参数(拉取数据)
		display(wd.getLow(),wd.getHeight(),wd.getWeather());
	}
	
	public void removeObserver(){
		observable.deleteObserver(this);
	}
	
}
 

<2>、观察者移动设备:Iphone

 

package com.kaishengit.java;

import java.util.Observable;
import java.util.Observer;

public class Iphone implements Observer{
	
	private Observable observable;
	public Iphone(){}
	public Iphone(Observable observable){
		this.observable = observable;
		observable.addObserver(this);
	}
	
	
	public void display(int low,int height,String weather){
		System.out.println("Iphone显示:→" +  "低温:" + low + "\t高温:" + height + "\t天气:" + weather);
	}

	public void removeObserver(){
		observable.deleteObserver(this);
	}
	@Override
	public void update(Observable o, Object arg) {
		Object[] objs = (Object[]) arg;//接受传递的参数(推送数据)
		display(Integer.valueOf(objs[0].toString()), Integer.parseInt(objs[1].toString()), objs[2].toString());
	}
}
 

<3>、观察者移动设备:Ipad

 

package com.kaishengit.java;

import java.util.Observable;
import java.util.Observer;

public class Ipad implements Observer{
	private Observable observable;
	public Ipad(){}
	
	public Ipad(Observable observable){
		this.observable = observable;
		observable.addObserver(this);
	}
	
	public void display(int low,int height,String weather){
		System.out.println("Ipad显示:→" + "低温:" + low + "\t高温:" + height + "\t天气:" + weather);
	}
	
	@Override
	public void update(Observable o, Object arg) {
		WeatherData wd = (WeatherData) o;
		display(wd.getLow(), wd.getHeight(), wd.getWeather());
	}
	
	public void removeObserver(){
		observable.deleteObserver(this);
	}
}

 可以自己添加设备和取消设备

<4>一切Ok,现在我们新建一个测试类:

 

package com.kaishengit.java;

public class Test {
	public static void main(String[] args) {
		WeatherData wd = new WeatherData();
		
		Android android = new Android(wd);
		android.removeObserver();//移除观察者
		
		Iphone iphone = new Iphone(wd);
		
		Ipad ipad = new Ipad(wd);
		
		wd.setData(12, 23, "晴");
		
	}
}

 运行结课:

 

Ipad显示:→低温:12 高温:23 天气:晴

Iphone显示:→低温:12 高温:23 天气:晴


ok,简单吧...
分享到:
评论

相关推荐

    设计模式:可复用面向对象软件的基础--详细书签版

    5.7 observer(观察者)—对象行为型 模式 194 5.8 state(状态)—对象行为型模式 201 5.9 strategy(策略)—对象行为型 模式 208 5.10 template method(模板方法) —类行为型模式 214 5.11 visitor...

    1.《设计模式:可复用面向对象软件的基础(完整书签)》

    行为型模式(Behavioral Patterns):这类模式关注对象之间的责任分配,如命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、访问者模式(Visitor)、备忘录模式(Memento)、观察者模式...

    (行为型模式) Observer 观察者模式

    - **《设计模式:可复用面向对象软件的基础》(Design Patterns: Elements of Reusable Object-Oriented Software)**,作者:Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides(简称GoF)。 - **《面向...

    设计模式可复用面向对象软件的基础 源码

    - 观察者模式(Observer):定义对象间的一对多依赖关系,当一个对象的状态改变时,所有依赖于它的对象都会得到通知并自动更新。 - 状态模式(State):允许对象在其内部状态改变时改变其行为,对象看起来似乎修改...

    java23种设计模式详解+源码(绝对详解)

    - 观察者模式(Observer):定义对象之间的一对多依赖关系,当一个对象的状态改变时,所有依赖于它的对象都会得到通知并自动更新。 - 状态模式(State):允许对象在其内部状态改变时改变它的行为,对象看起来似乎...

    设计模式(Design Patterns)中译本.rar

    设计模式是软件工程领域中的重要概念,源自于1994年由Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides四位杰出的软件工程师合著的经典书籍《设计模式:可复用面向对象软件的基础》(Design Patterns: ...

    设计模式(Design Patterns).pdf

    - 观察者模式(Observer):定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 - 迭代子模式(Iterator):提供一种方法顺序访问一个聚合对象中的各个...

    设计模式:可复用面向对象软件的基础

    行为型模式关注对象间的行为分配,如策略模式(Strategy Pattern)允许在运行时选择算法,观察者模式(Observer Pattern)定义了一对多的依赖关系,当一个对象的状态改变时,所有依赖于它的对象都会得到通知并自动...

    设计模式可复用面向对象软件的基础.zip

    5.7 OBSERVER(观察者)—对象行为型 模式 194 5.8 STATE(状态)—对象行为型模式 201 5.9 STRATEGY(策略)—对象行为型 模式 208 5.10 TEMPLATE METHOD(模板方法) —类行为型模式 214 5.11 VISITOR(访问者)—...

    Design Patterns 设计模式 东北大学软件学院 宋杰

    观察者模式(Observer)定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新;职责链模式(Chain of Responsibility)将请求的发送者和接收者解耦,形成一条处理...

    Software Architecture Design Patterns in Java(在Java的软件架构设计模式)

    10. 观察者模式:观察者模式定义了对象之间的一对多依赖关系,当一个对象的状态改变时,所有依赖于它的对象都会得到通知并自动更新。Java的Observer接口和Observable类就是对此模式的内置支持。 11. 命令模式:命令...

    designpatterns 设计模式

    迭代器模式(Iterator)提供一种方法顺序访问聚合对象的元素,而无需暴露其底层表示,观察者模式(Observer)定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动...

    GOF-设计模式-Design Patterns-英文原版-高清-有目录-有页码

    - **观察者**(Observer):定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。 - **状态**(State):允许一个对象在其内部状态改变时改变它的行为。 - **...

    C语言设计模式 PDF《C Design Pattern》

    void update_observer_a(void) { /* 更新观察者A */ } void update_observer_b(void) { /* 更新观察者B */ } Observer observer_a = {update_observer_a}; Observer observer_b = {update_observer_b}; ``` **2.10...

    JAVA设计模式-chm版

    包括责任链模式(Chain of Responsibility)、命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、中介者模式(Mediator)、备忘录模式(Memento)、观察者模式(Observer)、状态模式...

    java-design-patterns-PPT.zip_观察者模式ppt

    观察者模式,也称为发布-订阅(Publish-Subscribe)模式,是软件设计模式中的行为模式之一。在这一模式中,一个主题(Subject)维护着一个观察者(Observer)列表,并通知他们有关状态变化的消息。这种模式允许对象...

    23种面向对象设计模式

    3. **行为型模式**(Behavioral Patterns):关注对象之间的责任分配和通信,包括策略模式(Strategy)、模板方法模式(Template Method)、迭代器模式(Iterator)、观察者模式(Observer)、访问者模式(Visitor)...

    a_设计模式_designpatterns_

    - 观察者模式(Observer):定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被自动更新。 - 状态模式(State):允许一个对象在其内部状态改变时改变它的行为,...

    Head First Design Patterns 英文版 Head First设计模式

    行为型模式如策略(Strategy)、观察者(Observer)、装饰器(Decorator)和模板方法(Template Method)等,则关注对象间的行为协作。 每章结束时,书中还包含了要点整理和习题,帮助读者复习和巩固知识点。通过...

    整理 - 设计模式(Design Patterns)- 整理 Word版本

    3. 行为型模式:关注对象之间的责任分配和交互,如策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、命令模式(Command)、迭代器模式(Iterator)、访问者模式(Visitor)、备忘录...

Global site tag (gtag.js) - Google Analytics