[关闭]
@linux1s1s 2019-02-18T11:33:11.000000Z 字数 4085 阅读 811

Base Time-Design Patterns-Observer

Base 2017-01


基本概念:

观察者模式属于行为型模式,其意图是定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
这一个模式的关键对象是目标(Subject)和观察者(Observer)。一个目标可以有任意数目的依赖它的观察者,一旦目标的状态发生改变,所有的观察者都得到通知,作为对这个通知的响应,每个观察者都将查询目标以使其状态与目标的状态同步。

适用场景:

观察者模式,用于存在一对多依赖关系的对象间,当被依赖者变化时,通知依赖者全部进行更新。因此,被依赖者,应该有添加/删除依赖者的方法,且可以将添加的依赖者放到一个容器中;且有一个方法去通知依赖者进行更新。

实现思想

建立目标(subject)与观察者(observer)接口:

UML

此处输入图片的描述

Code

观察者接口Observer.java

  1. /**
  2. * @ClassName: Observer
  3. * @Description: 观察者
  4. * @date 2017/1/12 10:01
  5. */
  6. public interface Observer {
  7. void update();
  8. }

被观察者接口Subject.java

  1. /**
  2. * @ClassName: Subject
  3. * @Description: 被观察者
  4. * @date 2017/1/12 10:01
  5. */
  6. public interface Subject {
  7. void attach(Observer o);
  8. void detach(Observer o);
  9. void notice();
  10. }

观察者实现类Student.java

  1. /**
  2. * @ClassName: Student
  3. * @Description: 观察者实体类
  4. * @date 2017/1/12 10:09
  5. */
  6. public class Student implements Observer {
  7. private String mPhone;
  8. private final String mName;
  9. private final Teacher mTeacher;
  10. public Student(String name, Teacher teacher) {
  11. mName = name;
  12. mPhone = teacher.getPhone();
  13. mTeacher = teacher;
  14. }
  15. @Override
  16. public void update() {
  17. mPhone = mTeacher.getPhone();
  18. }
  19. public String showPhone() {
  20. return mPhone;
  21. }
  22. }

被观察者实现类Teacher.java

  1. /**
  2. * @ClassName: Teacher
  3. * @Description: 被观察者实体
  4. * @date 2017/1/12 10:14
  5. */
  6. public class Teacher implements Subject {
  7. private String mPhone;
  8. private final Vector<Observer> mObservers;
  9. private static final String DEFAULT = "13681877666";
  10. public Teacher() {
  11. mPhone = DEFAULT;
  12. mObservers = new Vector<Observer>();
  13. }
  14. @Override
  15. public void attach(Observer o) {
  16. if (o == null)
  17. return;
  18. if (mObservers.contains(o))
  19. return;
  20. mObservers.add(o);
  21. }
  22. @Override
  23. public void detach(Observer o) {
  24. if (o == null)
  25. return;
  26. if (mObservers.contains(o))
  27. return;
  28. mObservers.remove(o);
  29. }
  30. public void setPhone(String phone) {
  31. mPhone = phone;
  32. notice();
  33. }
  34. public String getPhone() {
  35. return mPhone;
  36. }
  37. @Override
  38. public void notice() {
  39. for (Observer o : mObservers) {
  40. o.update();
  41. }
  42. }
  43. }

测试用例TestCase.java

  1. /**
  2. * @ClassName: TestCase
  3. * @Description: 测试用例类
  4. * @date 2017/1/12 10:05
  5. */
  6. public class TestCase {
  7. private static Vector<Student> observers = new Vector<Student>();
  8. private TestCase() {
  9. //Do Nothing
  10. }
  11. public static void exe() {
  12. Teacher s = new Teacher();
  13. for (int i = 0; i < 10; i++) {
  14. Student o = new Student("Student" + i, s);
  15. s.attach(o);
  16. observers.add(o);
  17. }
  18. for (Student o : observers) {
  19. Log.i("observer", "Init phone is: " + o.showPhone());
  20. }
  21. s.setPhone("136818778888");
  22. for (Student o : observers) {
  23. Log.i("observer", "Update phone is: " + o.showPhone());
  24. }
  25. }
  26. }

验证结果

  1. 01-11 21:47:47.080 19812-19812/com..android.apps I/observer: Init phone is: 13681877666
  2. 01-11 21:47:47.080 19812-19812/com..android.apps I/observer: Init phone is: 13681877666
  3. 01-11 21:47:47.080 19812-19812/com..android.apps I/observer: Init phone is: 13681877666
  4. 01-11 21:47:47.080 19812-19812/com..android.apps I/observer: Init phone is: 13681877666
  5. 01-11 21:47:47.080 19812-19812/com..android.apps I/observer: Init phone is: 13681877666
  6. 01-11 21:47:47.080 19812-19812/com..android.apps I/observer: Init phone is: 13681877666
  7. 01-11 21:47:47.080 19812-19812/com..android.apps I/observer: Init phone is: 13681877666
  8. 01-11 21:47:47.084 19812-19812/com..android.apps I/observer: Init phone is: 13681877666
  9. 01-11 21:47:47.084 19812-19812/com..android.apps I/observer: Init phone is: 13681877666
  10. 01-11 21:47:47.084 19812-19812/com..android.apps I/observer: Init phone is: 13681877666
  11. 01-11 21:47:47.084 19812-19812/com..android.apps I/observer: Update phone is: 136818778888
  12. 01-11 21:47:47.084 19812-19812/com..android.apps I/observer: Update phone is: 136818778888
  13. 01-11 21:47:47.084 19812-19812/com..android.apps I/observer: Update phone is: 136818778888
  14. 01-11 21:47:47.084 19812-19812/com..android.apps I/observer: Update phone is: 136818778888
  15. 01-11 21:47:47.084 19812-19812/com..android.apps I/observer: Update phone is: 136818778888
  16. 01-11 21:47:47.084 19812-19812/com..android.apps I/observer: Update phone is: 136818778888
  17. 01-11 21:47:47.084 19812-19812/com..android.apps I/observer: Update phone is: 136818778888
  18. 01-11 21:47:47.084 19812-19812/com..android.apps I/observer: Update phone is: 136818778888
  19. 01-11 21:47:47.084 19812-19812/com..android.apps I/observer: Update phone is: 136818778888
  20. 01-11 21:47:47.084 19812-19812/com..android.apps I/observer: Update phone is: 136818778888

小结

请思考Android有哪些是观察者模式,留待思考,不再展开。

参考博文:

java常用设计模式

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注