使用时间:对象间存在一对多关系时,使用观察者模式(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 Listclist=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 Listclist=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); } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)