码迷,mamicode.com
首页 > 其他好文 > 详细

"围观"设计模式(19)--行为型之观察者模式(Observer Pattern)

时间:2016-06-12 02:35:29      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:

观察者模式是软件设计模式的一种。在此种模式中,一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实时事件处理系统。----WIKIPEDIA


个人理解

观察者模式,就是使得被观察者中持有观察者的对象实例,在发生某些事件的时候,通过notify“通知”观察者,完成相应的操作,他也叫作发布-订阅模式,定义对象间一对多的依赖关系,使得被观察者对象产生动作,即可通知其依赖的对象该被观察者发生了变更。


案例解析

正好前几天买了两只巴西龟,以这个为例子,乌龟也时会饿的,他饿了我就要去喂它吃的,这样的话,可以说正好用的到观察者模式。

推的方式

技术分享

public interface Observable {

	// 添加观察者
	public void addObserver(Observer observer);
	// 删除观察者
	public void removeObserver(Observer observer);
	// 通知观察者
	public void notifyObservers(String info);
}

public interface Observer {

	// 喂食
	public void feed(String info);
}

public class Turtle implements Observable{

	private List<Observer> observerList = new ArrayList<Observer>();
	
	public void hungry(){
		this.notifyObservers("我饿了!");
	}

	@Override
	public void addObserver(Observer observer) {
		observerList.add(observer);
	}

	@Override
	public void removeObserver(Observer observer) {
		if(observerList != null && observerList.contains(observer)){
			observerList.remove(observer);
		}
	}
	
	@Override
	public void notifyObservers(String info) {
		for (Observer observer : observerList) {
			observer.feed(info);
		}
	}
}

public class XX implements Observer {

	@Override
	public void feed(String info) {
		System.out.println("喂饲料!");
	}
	
}

这里的情况是Turtle类明确知道它要通知观察者什么,那么这种方式可以看成是推的方式,但是并不一定都是一定知道对方想要什么,那么这个时候,需要一种拉取得方式,也就是将自身的实例传递给观察者,交由观察者自己去决定获取什么也就是拉取什么。


拉的方式

主要的变更如下:

public class Turtle2 implements Observable2 {

	private List<Observer2> observerList = new ArrayList<Observer2>();
	
	public void hungry(){
		this.notifyObservers();
	}

	@Override
	public void addObserver(Observer2 observer) {
		observerList.add(observer);
	}

	@Override
	public void removeObserver(Observer2 observer) {
		if(observerList != null && observerList.contains(observer)){
			observerList.remove(observer);
		}
	}
	
	@Override
	public void notifyObservers() {
		for (Observer2 observer : observerList) {
			observer.feed(this);
		}
	}

	@Override
	public boolean isNeedFeed() {
		return true;
	}
}

观察者模式的优点

1. 观察者与被观察者之间是抽象耦合:扩展被观察者和观察者时较容易。

2. 建立一套触发机制,经过一系列的触发机制,形成触发链。


观察者模式的缺点

多级触发的时候,效率让人担忧,在设计的时候要充分的考虑这一点。


观察者模式的适用范围

1. 关联行为场景。

2. 事件的多级触发。

3. 跨系统的消息交换场景,消息队列的处理机制。


源代码下载

设计模式源代码下载地址


推荐阅读

"围观"设计模式(18)--行为型之模板方法模式(TemplateMethod Pattern) 

"围观"设计模式(16)--结构型之组合模式(Composite Pattern)


"围观"设计模式(19)--行为型之观察者模式(Observer Pattern)

标签:

原文地址:http://blog.csdn.net/wangyang1354/article/details/51614305

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!