观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种
观察者(Observer)将自己注册到被观察对象(Subject)中,被观察对象将观察者存放在一个容器(Container)里。
被观察者 被观察对象发生了某种变化(如图中的SomeChange),从容器中得到所有注册过的观察者,将变化通知观察者。
撤销观察 观察者告诉被观察者要撤销观察,被观察者从容器中将观察者去除。
public class TeacherSubject implements Subject { //用来存放和记录观察者 private List<Observer> observers=new ArrayList<>(); //记录状态的字符串 private String info; @Override public void addObserver(Observer obj) { observers.add(obj); } @Override public void deleteObserver(Observer obj) { int i=observers.indexOf(obj); if (i>=0){ observers.remove(obj); } } @Override public void notifyObserver() { for (int i=0;i<observers.size();i++){ Observer o=observers.get(i); o.update(info); } } //布置作业的方法,在方法最后,需要调用notifyObserver()方法,通知所有观察者更新状态 public void setHomework(String info){ this.info=info; System.out.print("今天的作业是"+info); this.notifyObserver(); } } public class StudentObserver implements Observer { //保存一个Subject的引用,以后如果可以想取消订阅,有了这个引用会比较方便 private TeacherSubject t; //学生的姓名,用来标识不同的学生对象 private String name; //构造器用来注册观察者 public StudentObserver(String name, TeacherSubject t){ this.name=name; this.t=t; t.addObserver(this); } @Override public void update(String info) { System.out.print(name+"得到作业:"+info); } } /** * Created by Administrator on 2017-10-9. * Oserver接口 */ public interface Observer { void update(String info); } /** * Created by Administrator on 2017-10-9. * 被观察者Teacher: */ public class Teacher extends Observable { //布置作业的状态信息字符串 private String info; public void setHomework(String info){ this.info=info; System.out.println("布置的作业是"+info); setChanged(); notifyObservers(); } public String getInfo(){ return info; } } /** * Created by Administrator on 2017-10-9. * 观察者Student */ public class Student implements java.util.Observer{ private Observable ob; private String name; public Student(String name,Observable ob){ this.ob=ob; this.name=name; ob.addObserver(this); } @Override public void update(Observable observable, Object data) { Teacher t= (Teacher) observable; System.out.println(name+"得到作业信息:"+t.getInfo()); } } /** * Created by Administrator on 2017-10-9. * //主题接口 */ public interface Subject { //添加观察者 void addObserver(Observer obj); //移除观察者 void deleteObserver(Observer obj); //当主题方法改变时,这个方法被调用,通知所有的观察者 void notifyObserver(); } /** * 观察者模式(Observer) */ public class ObserverMethodActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_observer_method); TeacherSubject teacherSubject=new TeacherSubject(); StudentObserver zhangsan=new StudentObserver("张三",teacherSubject); StudentObserver lisi=new StudentObserver("李四",teacherSubject); StudentObserver wangwu=new StudentObserver("王五",teacherSubject); teacherSubject.setHomework("第二页第六题"); teacherSubject.setHomework("第三页第七题"); // java内置的观察者模式: Teacher teacher=new Teacher(); com.zhangyingjie.DesignMode.ObserverMehtod.Student zhaoliu=new com.zhangyingjie.DesignMode.ObserverMehtod.Student("赵六",teacher); com.zhangyingjie.DesignMode.ObserverMehtod.Student sunqi=new com.zhangyingjie.DesignMode.ObserverMehtod.Student("孙七",teacher); teacher.setHomework("第四页第八题"); teacher.setHomework("第五页第九题"); } }
github地址:https://github.com/zyj18410105150/DesignMode