黑马程序员-观察者模式(Observer)

---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------

观察者模式:行为型设计模式

特点:有一个被观察者,有众多观察者,当被观察者的状态发生变化时,所有观察者都能够察觉。

Observer模式是行为模式之一,它的作用是当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态,,Observer模式提供给关联对象一种同步通信手段,使某个对象与依赖它的其他对象之间保持同步通信。

《设计模式》一书对Observer是这样描述的,定义对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都将得到通知并自动更新。

别名:订阅,发布-订阅


实例:

父母是孩子的监护人,孩子发生什么事一般都会通知给父母,利用观察者模式解题(孩子是被观察者,父母是观察者)

Subject类:被观察者

Student类:具体的被观察者

Observer类:观察者

Father类:具体的观察者

Mother类:具体的观察者

TestObserver类:测试类

 

 

 

Subject类:

public interface Subject {

	void Attach(Observer observer);

	void Detach(Observer observer);

	void Notify();

	void setStudentState(String studentState);
}

Student

import java.util.ArrayList;

public class Student implements Subject {
	private String studentState;
	private static ArrayList<Observer> list;
	static {
		list = new ArrayList();
	}

	public String getStudentState() {
		return studentState;
	}

	public void setStudentState(String studentState) {
		this.studentState = studentState;
		Notify();
	}

	@Override
	public void Attach(Observer observer) {
		// TODO Auto-generated method stub
		list.add(observer);
	}

	@Override
	public void Detach(Observer observer) {
		// TODO Auto-generated method stub
		list.remove(observer);
	}

	@Override
	public void Notify() {
		// TODO Auto-generated method stub
		for (Observer o : list) {
			o.Update(this);
		}
	}

}

Observer

public interface Observer {

	void Update(Student std);
}

Father

public class Father implements Observer {

	@Override
	public void Update(Student std) {
		// TODO Auto-generated method stub
		if (std.getStudentState() == "打架") {
			System.out.println("告诉father孩子打架啦");
		} else if (std.getStudentState() == "得奖") {
			System.out.println("告诉father孩子得奖了");
		}
	}

}

Mother

public class Mother implements Observer {

	@Override
	public void Update(Student std) {
		// TODO Auto-generated method stub
		if (std.getStudentState() == "打架") {
			System.out.println("告诉mother孩子打架啦");
		} else if (std.getStudentState() == "得奖") {
			System.out.println("告诉mother孩子得奖了");
		}
	}

}

TestObserver

public class TestObserver {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Subject sub = new Student();
		Observer father = new Father();
		Observer mother = new Mother();
		sub.Attach(mother);
		sub.Attach(father);
		sub.setStudentState("打架");
		sub.Detach(mother);
		sub.setStudentState("得奖");

	}

}

由于观察者模式在java中应用非常广泛,所及JDK提供了对observer设计模式的支持 

1、通过java.util.Observable类扮演Subject角色,一个类只需要继承java.util.Observable类便可担当具体的被观察者角色

2、通过java.util.Observer接口扮演Observer角色,一个类只要实现java.util.Observer接口便可担当具体的观察者角色

3、java.util.Ovservable的实现类通过调用setChanged()方法以及notifyObservers(Object)方法便可简单的通知Observer

有兴趣的可以自己写,此处不再给出具体实现



---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值