`

设计模式:观察者模式(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...

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

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

    设计模式精解 译者:熊节 程序员必看书籍之一 part2

    设计模式精解(Design Patterns Explained) ...如何实现关键模式——Strategy(策略)、Observer(观察者)、Bridge(桥接)、Decorator(装饰)等等。 共同点/变化点分析、设计模式以及它们如何帮助理解抽象类。

    [Java设计模式(第2版)(Design.Patterns.in.Java).John.Metsker

    第9章 观察者(observer)模式 72 第10章 调停者(mediator)模式 85 第11章 代理(proxy)模式 97 第12章 职责链(chain of responsibility)模式 115 第13章 享元(flyweight)模式 122 第14章 构造型模式介绍 130 第15章 ...

    设计模式精解 译者:熊节 程序员必看书籍之一 part1

    设计模式精解(Design Patterns Explained) ...如何实现关键模式——Strategy(策略)、Observer(观察者)、Bridge(桥接)、Decorator(装饰)等等。 共同点/变化点分析、设计模式以及它们如何帮助理解抽象类。

    设计模式(Design.Patterns.CHN)

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

    C++设计模式(Design Pattern)范例源代码

    23种设计模式(Design Pattern)的C++实现范例,包括下面列出的各种模式,代码包含较详细注释。...观察者模式(Observer) 状态模式(State) 策略模式(Strategy) 模板方法模式(Template Method) 访问者模式(Visitor)

    design_patterns

    patterns(设计模式)Design Patterns In PythonDesign Patterns Introduction(设计模式介绍)Strategy Pattern(策略模式)实现:design_patterns/strategy.py示例:examples/strategy_example.pyObserver Pattern...

    java餐饮管理系统源码6-design-patterns:设计模式

    观察者模式定义了对象之间一对多的依赖, 这样一来, 当一个对象改变状态 所有依赖都会收到通知, 自动更新 :beer_mug:设计原则1: 为了交互对象之间的松耦合设计而努力 :star:实现细节 自己设计的Observer/Subject: 见 ...

    Design-patterns:java23种设计模式,深入理解灵活运用设计模式对于优化代码质量,提高编程能力非常必要!

    Design-patterns java23种设计模式,深入理解灵活运用设计模式对于优化代码质量,提高...观察者模式 Observer mode 组合模式 Portfolio model 策略模式 The strategy pattern 责任链模式 Chain of responsibility model

    design-patterns-spring-boot:Spring引导中的设计模式

    观察者 面向方面的编程 该演示应用程序从2个不同的银行的网站(可以添加更多的银行)中检索联系电话,每个银行都有特定的实现,并提供了一个漂亮的界面来隐藏详细信息。 入门 这些说明将为您提供在本地计算机上运行...

    百度地图开发java源码-DesignPatterns:要深刻理解开源代码,必先掌握丰富的设计模式

    百度地图开发java源码 DesignPatterns 目录 ###设计模式 #####1 创建型模式 1.1 工厂方法(FactoryMethod) 1.2 抽象工厂(AbstractFactory) ...观察者模式(Observer) 3.8 状态模式(State) 3.9 策略模式(Stra

    二十三种设计模式【PDF版】

    设计模式之 Observer(观察者) 介绍如何使用 Java API 提供的现成 Observer 设计模式之 Iterator(迭代器) 这个模式已经被整合入Java的Collection.在大多数场合下无需自己制造一个Iterator,只要将对象装入...

    design-patterns:普通英语和简单代码的Java设计模式

    观察者模式定义了对象间的一对多依赖。当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。 Decorator 装饰者模式动态的将责任附加到对象上。想要扩展功能,装饰者提供有别于继承的另一种选择。

    novi-java-design-patterns-example:仅仅是对设计模式概念的第一次熟悉。 类材料

    观察者模式 :copyright:Novi Hogeschool。 Geschreven门Nick Stuivenberg 内含 在另一个项目中,请查看je een voorbeeld van de Observer Pattern。 解码器中的代码包是由duidelijke安排的,目的是使observer和...

    Design-Patterns:用Java实现的所有设计模式,包括代码,说明和学习资源

    使用Java的设计模式 ...观察者 轻量级 状态 代理人 战略 模板 游客 设计原则 好莱坞原则 单一责任原则 我想推荐的其他资源很少 头先设计模式 克里斯托弗·奥克拉维(Christopher Okhravi)的精彩播放列表 重构大师

    asp.net知识库

    2分法-通用存储过程分页(top max模式)版本(性能相对之前的not in版本极大提高) 分页存储过程:排序反转分页法 优化后的通用分页存储过程 sql语句 一些Select检索高级用法 SQL server 2005中新增的排序函数及应用 ...

    Design-Patterns

    Design-Patterns 设计模式介绍 GoF的23种设计模式学习笔记,结合自己在实现工作项目中用到的情况,讲解设计模式。...观察者模式(Observer) 讲解点击  代码点击 装饰模式(Decorator) 讲解点击这里  代码点击Decorator

    leetcode伪代码-my-demo:我的演示

    设计模式 Design Patterns 单例模式 Singleton 观察者模式 Observer 多线程 Concurrent 自旋锁 SpinLock 任务调度器 CommonTaskSchedule 线程池 CommonThreadPool 算法题 LeetCode 链表 LinkedList 栈、队列、堆 ...

Global site tag (gtag.js) - Google Analytics