使用时间:对象间存在一对多关系时,使用观察者模式(Observer Pattern)
用法:当一个对象被修改时,则会自动通知依赖它的对象。
具体事例:当微信公众号发布新的文章后,关注它的用户会自动接收到文章信息。当课程表修改之后,所有使用课表的学生都会接收到新的课表。
模式实现:本质上使用一个列表,将观察者放入里面。更新时,将信息传到列表中的观察者里。让观察者分别使用信息调用自身的方法。
代码实现事例:课程表修改。
代码实现结果:
首先定义被观察对象的父类,即需要规范被观察对象的行为,这里的被观察者对象为课程表(timetable)
class Subject{
public void attach(Observer observer){}
public void detach(Observer observer){}
public void notifys(Observer observer){}
}
定义课程表类,实现父类定义的方法,并将观察者加入列表。
class Timetable extends Subject{
private List clist=new ArrayList();
public String timetablemessage;
public void attach(Observer observer){
clist.add(observer);
}
public void detach(Observer observer){
clist.remove(observer);
}
public void notifys(){
for (Observer observer:clist)
{
observer.update(timetablemessage);
}
}
public void SetTimetable(String timetablemessage){
this.timetablemessage = timetablemessage;
System.out.println("+++++++++++++现在的课程表是"+timetablemessage+"++++++++++++++++++++++++++");
}
}
定义观察者的父类,用来规范子类的行为,这里具体规范学生要实现的方法。
class Observer{
void update(String timetablemessage){}
}
定义学生类,获取更新的信息,完成更新
class Student extends Observer{
String name;
Student(String name)
{
this.name = name;
}
void update(String timetablemessage){
System.out.println(name+"已收到"+timetablemessage);
}
}
主函数调用
class Observer_Pattern {
public static void main(String[] args){
//创建观察者
Observer student1 =new Student("小红");
Student student2 =new Student("小明");
Student student3 =new Student("小李");
Timetable timetable = new Timetable();
//将观察者添加到列表
timetable.attach(student1);
timetable.attach(student2);
timetable.attach(student3);
System.out.println("设置课程表,发送给每一个观察者");
timetable.SetTimetable("秋季课程表");//设置课程表
timetable.notifys(); //通知所有观察者
System.out.println("修改课程表内容,发送新的课程表");
timetable.SetTimetable("夏季季课程表,嘻嘻");//重置课程表
timetable.notifys(); //通知观察者,更新学生的课程表
}
}
完整代码:
package Observer_Pattern;
import java.util.List;
import java.util.ArrayList;
class Observer_Pattern {
public static void main(String[] args){
//创建观察者
Observer student1 =new Student("小红");
Student student2 =new Student("小明");
Student student3 =new Student("小李");
Timetable timetable = new Timetable();
//将观察者添加到列表
timetable.attach(student1);
timetable.attach(student2);
timetable.attach(student3);
System.out.println("设置课程表,发送给每一个观察者");
timetable.SetTimetable("秋季课程表");//设置课程表
timetable.notifys(); //通知所有观察者
System.out.println("修改课程表内容,发送新的课程表");
timetable.SetTimetable("夏季季课程表,嘻嘻");//重置课程表
timetable.notifys(); //通知观察者,更新学生的课程表
}
}
class Subject{
public void attach(Observer observer){}
public void detach(Observer observer){}
public void notifys(Observer observer){}
}
class Timetable extends Subject{
private List clist=new ArrayList();
public String timetablemessage;
public void attach(Observer observer){
clist.add(observer);
}
public void detach(Observer observer){
clist.remove(observer);
}
public void notifys(){
for (Observer observer:clist)
{
observer.update(timetablemessage);
}
}
public void SetTimetable(String timetablemessage){
this.timetablemessage = timetablemessage;
System.out.println("+++++++++++++现在的课程表是"+timetablemessage+"++++++++++++++++++++++++++");
}
}
class Observer{
void update(String timetablemessage){}
}
class Student extends Observer{
String name;
Student(String name)
{
this.name = name;
}
void update(String timetablemessage){
System.out.println(name+"已收到"+timetablemessage);
}
}



