今天的任务:学习"观察者模式"
一、观察者模式:Observer模式定义对象间的一对多的依赖关系,当一个对象(被观察者)的状态发生改变时, 所有依赖于它的对象(观察者)都得到通知并被自动更新。
在目标对象中会有观察者集合,当目标对象有变化时将会通知所有观察者集合对象做相关更新操作。
二、实例 :
老师有电话号码,学生需要知道老师的电话号码以便在需要的时候拨打,在这样的模式中,老师就是一个被观察者(Subject),学生就是需要知道信息的观察者。当老师的电话号码发生改变时,学生会得到通知,并更新相应的电话记录。
public interface IObServer { public void update(String msg); }
public class Student implements IObServer { private String student_name; public Student(String name){ student_name = name; } public void update(String msg) { System.out.println(student_name + ":\t" + msg); } }
public interface ISubject { //添加一个通知 public void add(IObServer o); //移除一个通知 public void del(IObServer o); //执行下达通知的指令 public void notice(); }
import java.util.ArrayList; public class Teacher implements ISubject { //定义students:所有学生 private ArrayList<IObServer> students = new ArrayList<IObServer>(); private String msg = "";//老师要发出的信息 public void setMsg(String new_msg){ msg = new_msg; } //收集所有学生信息 public void add(IObServer o) { students.add(o); } public void del(IObServer o) { students.remove(o); } //通知学生 public void notice() { for(int i=0;i<students.size();i++){ students.get(i).update(msg); } } }
public class Test { public static void main(String[] args) { ArrayList<IObServer> students = new ArrayList<IObServer>(); Teacher t = new Teacher(); for(int i=1;i<=10;i++){ Student s = new Student("aa"+i); students.add(s); t.add(s); } t.setMsg("phone:123456789"); t.notice(); System.out.println("-----把其中几个学生移除接收通知的范围--------------"); for(int i=0;i<students.size();i++){ if(i%2==0){ t.del(students.get(i)); } } t.notice(); } }
三、模式优缺点
观察者模式的优点:
1、观察者模式可以实现表现层和数据逻辑层的分离,并定义了稳定的消息更新传递机制,抽象了更新接口,使得可以有各种各样不同的表现层作为具体观察者角色。
2、观察者模式在观察目标和观察者之间建立一个抽象的耦合。
3、观察者模式符合“开闭原则”的要求。
观察者模式的缺点:
1、如果一个观察目标对象有很多直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。
2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发他们之间进行循环调用,可能导致系统崩溃。
3、观察者模式没有相应的机制让观察者知道所有观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化
四、观察者模式适用环境
在以下情况下可以适用观察者模式:
1、一个抽象的模型有两个方面,其中一个方面依赖于另一个方面。将这些方面封装在独立的对象中使它们可以各自独立的改变和复用。
2、一个对象的改变将导致其他一个或多个对象也发生改变,而不知道具体有多少对象将发生改变,可以降低对象之间的耦合度。
3、一个对象必须通知其他对象,而并不知道这些对象是谁
4、需要在系统中创建一个触发链,A对象的行为将影响B对象,B对象的行为将影响C对象...,可以适用观察者模式创建一种链式触发机制
相关推荐
最新教科版二年级科学上册第一单元课件-1-4《观察月相》.pptx
20210429-华创证券-4月海外月度观察:发达国家宽松延续,新兴市场仍待加息.pdf
20210519-招商证券-行业景气观察(0519):4月重卡销量创同期新高,集装箱行业景气上行.pdf
我国汽车金融行业发展问题研究-5月4号-论文.zip
2010-4月实验题-VTP2010-4月实验题-VTP2010-4月实验题-VTP2010-4月实验题-VTP
9月17日-破解“四难”是发展的有效途径-加快构建“中原经济.pdf
2021九师联盟高三4月联考--英语试卷+答案
NULL 博文链接:https://songzhan.iteye.com/blog/1852350
2008年4月数据库工程师---计算机等级考试试题,我整理过的
【4月-华勘院】数字孪生打造未来社区规划建设新模式-44页.pdf
2021九师联盟高三4月联考--语文试卷+答案
2021九师联盟高三4月联考--文综试卷+答案
2021九师联盟高三4月联考--理综试卷+答案
2021九师联盟高三4月联考--文数试卷+答案
2021九师联盟高三4月联考--理数试卷+答案
行业-4月海外月度观察-发达国家宽松延续,新兴市场仍待加息.rar
三角区四月销售总结-2页.pdf
2020年1-4月---地生活外卖行业发展分析报告-Fastdata极数-202005精品报告2020.rar
2020年1-4月---地生活外卖行业发展分析报告-Fastdata极数-202005精品报告2020.pdf
2004年4月---2007年9月全国计算机等级考试二级笔试试卷.pdf