`

head first 设计模式之观察者模式之总结

阅读更多

观察者模式要点:

1.观察者模式定义了对象之间一对多的关系

2.主题(也就是可观察者)用一个共同的接口来更新观察者

3.观察者和可观察者之间用松耦合方式,可观察者不知道观察者的细节,只知道观察者实现了观察者接口

4.使用此模式时,你可从被观察者处推或拉数据

5.有多个观察者时,不可以以来特定的通知次序

6.java有多种观察者模式的实现,包括通用的java.util.Observable

7.要注意java.util.Observable实现上所来来的一些问题

8.Swing大量使用观察者模式,许多GUI框架也是如此

9.此模式也被应用在许多地方,例如:JavaBean、RMI

 

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

 

结构总结:从具体主题角色指向抽象观察者角色的合成关系,代表具体主题对象可以有任意多个对抽象观察者对象的引用。之所以使用抽象观察者而不是具体观察者,意味着主题对象不需要知道引用了哪些ConcreteObserver类型,而只知道抽象Observer类型。这就使得具体主题对象可以动态地维护一系列的对观察者对象的引用,并在需要的时候调用每一个观察者共有的Update()方法。这种做法叫做"针对抽象编程"。

 

观察者模式的优缺点:

      Observer模式的优点是实现了表示层和数据逻辑层的分离,并定义了稳定的更新消息传递机制,类别清晰,并抽象了更新接口,使得可以有各种各样不同的表示层(观察者)。但是其缺点是每个外观对象必须继承这个抽像出来的接口类,这样就造成了一些不方便,比如有一个别人写的外观对象,并没有继承该抽象类,或者接口不对,我们又希望不修改该类直接使用它。虽然可以再应用Adapter模式来一定程度上解决这个问题,但是会造成更加复杂烦琐的设计,增加出错几率。

      观察者模式的效果有以下几个优点:

       (1)观察者模式在被观察者和观察者之间建立一个抽象的耦合。被观察者角色所知道的只是一个具体现察者聚集,每一个具体现察者都符合一个抽象观察者的接口。被观察者并不认识任何一个具体观察者,它只知道它们都有一个共同的接口。由于被观察者和观察者没有紧密地耦合在一起,因此它们可以属于不同的抽象化层次。

       (2)观察者模式支持广播通信。被观察者会向所有的登记过的观察者发出通知。

观察者模式有下面的一些缺点:

       (1)如果一个被观察者对象有很多直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。

       (2)如果在被观察者之间有循环依赖的话,被观察者会触发它们之间进行循环调用,导致系统崩溃。在使用观察考模式时要特别注意这一点。

       (3)如果对观察者的通知是通过另外的线程进行异步投递的话,系统必须保证投递是以自恰的方式进行的。

       (4)虽然观察者模式可以随时使观察者知道所观察的对象发生了变化,但是观察者模式没有相应的机制使观察者知道所观察的对象是怎么发生变化

public interface Subject {

	public void register(Observer observer);

	public void remove(Observer observer);

	public void notifiedObserver();

}

 

public interface Observer {

	public void update(float temp, float humidity, float pressure);

}

 

 

import java.util.*;

public class WeatherDate implements Subject {
	private float temp;
	private float humidity;
	private float pressure;

	List list = new ArrayList();

	public void register(Observer observer) {
		list.add(observer);

	}

	public void remove(Observer observer) {
		int i = list.indexOf(observer);
		if (i >= 0) {
			list.remove(i);
		}
	}

	public void notifiedObserver() {
		for (int i = 0; i < list.size(); i++) {
			Observer observer = (Observer) list.get(i);
			observer.update(temp, humidity, pressure);

		}

	}

	public void changeDate() {
		notifiedObserver();

	}

	public void setMeasure(float temp, float humidity, float pressure) {
		this.temp = temp;
		this.humidity = humidity;
		this.pressure = pressure;
		changeDate();

	}

}

 

public class CurrentConditionsDisplay implements Observer {
	
	private float temp;
	private float humidity;
	private float pressure;
	private WeatherDate wd ;
	
	public CurrentConditionsDisplay(WeatherDate wd){
		this.wd = wd;
		wd.register(this);
	
	}

	public void update(float temp, float humidity, float pressure) {
		this.temp = temp;
		this.humidity = humidity;
		this.pressure = pressure;
		display();

	}
	
	public void display(){
		System.out.println("Current condition:"+ temp+"F degrees and" +humidity +"%humidty");
	}

}

 

public class WeatherStation {

	public static void main(String[] args) {

		WeatherDate weatherdate = new WeatherDate();
		CurrentConditionsDisplay condition = new CurrentConditionsDisplay(
				weatherdate);

		weatherdate.setMeasure(80, 65, 70);

	}

}

 

 

 

分享到:
评论

相关推荐

    head first 设计模式 观察者模式 C++ 代码

    head first 设计模式 观察者模式 C++ 代码

    《HeadFirst设计模式》观察者模式c++实现代码

    观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。 Observer Pattern defines a one-to-many dependency between objects so that when one object ...

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

    NULL 博文链接:https://jacky-dai.iteye.com/blog/1132063

    HeadFirst 设计模式学习笔记2--观察者模式 demo

    HeadFirst 设计模式学习笔记2--观察者模式 demo http://blog.csdn.net/laszloyu/archive/2010/05/12/5581769.aspx

    head first 设计模式例子源代码 c++版 第二章 观察者模式

    最近在看head first 设计模式,书上的例子是用java编写的.因为工作上C用的比较多,所以决定编看书,边用C++也编写书上的例子.既可以加深对设计模式的理解,也顺便练习下c++. 希望这写代码也能帮助别人学习c++和设计模式...

    HeadFirst设计模式.rar

    中文扫描版文档,高清。在pad上可以放大使用也不会模糊!!!!内含的设计模式有:观察者模式等...

    Head First 设计模式 JAVA源码

    所有的设计模式Java实现。 第一讲:简单工厂模式 第二讲:工厂方法模式 第三讲:抽象工厂模式 第四讲:工厂模式在开发中的运用 第五讲:单例模式 第六讲:原型模式 ...第三十讲:设计模式总结

    head first 设计模式

    2 观察者模式 让你的对象知悉现况 3 装饰者模式 装饰对象 4 工厂模式 烘烤OO的精华 5 单件模式 独一无二的对象 6 命令模式 封装调用 7 适配器模式与外观模式 随遇模式 8 模板方法模式 封装算法 9 选代器与组合模式 ...

    Head First设计模式 中文 高清

    2 观察者模式 让你的对象知悉现况 3 装饰者模式 装饰对象 4 工厂模式 烘烤OO的精华 5 单件模式 独一无二的对象 6 命令模式 封装调用 7 适配器模式与外观模式 随遇模式 8 模板方法模式 封装算法 9 选代器与组合模式 ...

    Head First 设计模式(中文完整版+附书源码)

    经典的设计模式,单例模式、工厂模式、装饰模式、观察者模式

    Head.First设计模式_PDF.part1

    Head.First设计模式_PDF(高清扫描版) 第一部分(共三部分) 在我的资源下可找到其他两部部分 强大的写作阵容。《Head First设计模式》作者Eric Freeman和ElElisabeth Freeman是作家、讲师和技术顾问。Eric拥有耶鲁...

    Head First(Design Patterns) 设计模式英文原版

     2观察者模式让你的对象知悉现况  3装饰者模式装饰对象  4工厂模式烘烤OO的精华  5单件模式独一无二的对象  6命令模式封装调用  7适配器模式与外观模式随遇模式  8模板方法模式封装算法  9选...

    HeadFirst源代码

    HeadFirst源代码,所有设计模式JAVA代码,观察者模式,装饰者模式,工厂模式,单件模式,命令模式,适配器模式,外观模式等

    Head.First.设计模式.中文版 1-8章

    Head.First.设计模式.中文版 1 欢迎来到设计模式世界:设计模式入门  模拟鸭子应用  Joe想到继承  利用接口如何?  软件开发的不变真理  分开变化和不变部分  设计鸭子的行为  测试鸭子的代码  动态地设置...

    设计模式---观察者模式

    根据《HeadFirst 设计模式》自己操作实现的观察者模式Java代码

    C#,设计模式,观察者模式,气像站,

    C#,设计模式,观察者模式,气像站,C#,设计模式,观察者模式,气像站,,这是 Head First 上面所用的例子,有一点修改,始其可以直接运行。

    观察者模式简单例子

    观察者模式的简单例子,根据《Head First设计模式》第2章中的天气预告版的例子编写

    Head First Design Pattern(en) pdf(part1)

    1 欢迎来到设计模式世界:设计模式入门  模拟鸭子应用  Joe想到继承  利用接口如何?  软件开发的不变真理  分开变化和不变部分  设计鸭子的行为  测试鸭子的代码  动态地设置行为  封装行为的大局观  ...

Global site tag (gtag.js) - Google Analytics