---------------------- <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>、期待与您交流! ----------------------