观察者模式--帮我把个风

观察者模式,从名字来讲就是观察的意思,

一个比较有意思的例子,考试作弊是怎样的?

一个或者多个望风的,其他的紧锣密鼓的抄,一有情况,赶紧停下来。

没错,观察者模式也大概就是这样的流程。

先看类图:



上述类图为了使程序代码更容易扩展,将subject和observer都抽象出来了一层,降低了耦合度。

观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。

这个主题对象在自己状态发生改变时,会通知所有观察者对象,使他们能够自动更新自己。

也就是如果这样一种情况:当一个对象的改变需要同时改变其他对象的时候,则优先考虑观察者模式。


观察者模式所做的工作其实就是在接触耦合,让耦合的双方都依赖于抽象,而不是依赖于具体,

从而使的格子变化都不会影响到另一边的变化。


下面看看具体代码:

Observer类:

package com.blog.anla.Observer;
/**
 * 通知模式(observer)又叫发布订阅模式(Publish/Subscribe)
 * 
 * 抽象观察者,update方法用于从
 * 通知者中获得最新的信息
 * @author U-ANLA
 *
 */
public abstract class Observer {
	public abstract void update();
}


Subject类:

package com.blog.anla.Observer;

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

/**
 * 它把所有对观察者对象的引用保存在一个聚集里,每个主题都可以有任何数量的观察者
 * 抽象主题提供一个接口,可以增加和删除观察者对象
 * @author U-ANLA
 *
 */
public abstract class Subject {
	private List<Observer> observers = new ArrayList<Observer>();
	
	public void attach(Observer observer){
		observers.add(observer);
	}
	
	public void detach(Observer observer){
		observers.remove(observer);
	}
	/**
	 * 通知每一个观察者
	 */
	public void myNotify(){
		for(int i = 0;i < observers.size();i++){
			observers.get(i).update();
		}
	}
}


ConcreteObserver类:

package com.blog.anla.Observer;
/**
 * 具体的观察者。
 * @author U-ANLA
 *
 */
public class ConcreteObserver extends Observer{

	private String name;
	private String observerState;
	
	private ConcreteSubject subject;
	
	public ConcreteObserver(ConcreteSubject subject ,String name) {
		this.subject = subject;
		this.name = name;
	}
	
	@Override
	public void update() {
		observerState = subject.getSubjectState();
		System.out.println("观察者:" + name + "的新状态是"+observerState);
	}

	public ConcreteSubject getSubject() {
		return subject;
	}

	public void setSubject(ConcreteSubject subject) {
		this.subject = subject;
	}
	
	
}


ConcreteSubject类:

package com.blog.anla.Observer;
/**
 * 具体主题或者具体主题统治者,将有关状态存入具体观察者
 * 对象,在具体主题的内部状态改变时,给所有登记过的观察者发出通知
 * @author U-ANLA
 *
 */
public class ConcreteSubject extends Subject{
	private String subjectState;
	public String getSubjectState() {
		return subjectState;
	}
	public void setSubjectState(String subjectState) {
		this.subjectState = subjectState;
	}
}


观察者模式有点绕,我也还需要多看些实际例子去理解的!

赠人玫瑰手留余香(oo)









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值