观察者模式:定义一种一对多的依赖关系,让多个观察者对象关联一个对象,当这个对象发生变化时,会通知所有观察者对象,让他们自动更新自己

    优点:自动更新状态,不需要额外执行

    实现:工作之余,同事之间会讨论股票,讨论NBA等,但是如果让老板看到,即使本职工作已经完成,老板依然会不爽。这时候,就有同事跟前台打好关系,当老板回来时,通知大家,让大家回归工作状态。

    1、抽象观察者、抽象通知者

    1. /**
    2. * 抽象观察者
    3. */
    4. public abstract class Observer {
    5. /**
    6. * 观察者名称
    7. */
    8. String name;
    9. /**
    10. * 通知类
    11. */
    12. Subject sub;
    13. /**
    14. * 修改方法
    15. */
    16. public abstract void update();
    17. }
    18. /**
    19. * 抽象通知类
    20. */
    21. public abstract class Subject {
    22. /**
    23. * 添加被通知观察者
    24. */
    25. public abstract void addObserver(Observer observer);
    26. /**
    27. * 移除被通知观察者
    28. */
    29. public abstract void deleteObserver(Observer observer);
    30. /**
    31. * 通知
    32. */
    33. public abstract void notifit();
    34. /**
    35. * 通知消息
    36. */
    37. String subjectStaff;
    38. public String getSubjectStaff() {
    39. return subjectStaff;
    40. }
    41. public void setSubjectStaff(String subjectStaff) {
    42. this.subjectStaff = subjectStaff;
    43. }
    44. }

    2、观察者实现

    1. /**
    2. * 看NBA的员工
    3. */
    4. public class ObserverStaffNba extends Observer{
    5. public ObserverStaffNba(String name , Subject sub){
    6. super.name = name;
    7. super.sub = sub;
    8. }
    9. /**
    10. * 修改方法
    11. */
    12. public void update(){
    13. System.out.println(MessageFormat.format("{0},{1}关闭NBA,开始工作", sub.getSubjectStaff() , this.name));
    14. }
    15. }
    16. /**
    17. * 看股票的员工
    18. */
    19. public class ObserverStaffShares extends Observer{
    20. public ObserverStaffShares(String name , Subject sub){
    21. super.name = name;
    22. super.sub = sub;
    23. }
    24. /**
    25. * 修改方法
    26. */
    27. public void update(){
    28. System.out.println(MessageFormat.format("{0},{1}关闭股票,开始工作", sub.getSubjectStaff() , this.name));
    29. }
    30. }

    3、通知者实现

    1. /**
    2. * 前台
    3. */
    4. public class SubjectReception extends Subject{
    5. List<Observer> list = new ArrayList<>();
    6. public void addObserver(Observer observer){
    7. list.add(observer);
    8. }
    9. public void deleteObserver(Observer observer){
    10. list.remove(observer);
    11. }
    12. public void notifit(){
    13. list.forEach(observer -> {
    14. observer.update();
    15. });
    16. }
    17. }

    4、测试

    1. /**
    2. * 测试观察者模式
    3. */
    4. public class TestObserver {
    5. public static void main(String [] args){
    6. Subject subject = new SubjectReception();
    7. subject.addObserver(new ObserverStaffNba("张三", subject));
    8. subject.addObserver(new ObserverStaffShares("李四", subject));
    9. subject.setSubjectStaff("老板来了");
    10. subject.notifit();
    11. }
    12. }

    测试结果:
    image.png

    观察者模式又成为发布-订阅模式,Subject作为一个通知类,把对应观察者放在一个集合里面,当通知类发生一定变化时,统一执行观察者集合。观察者模式的优势在于,当系统被分割成相互协作的类时,需要维护对象之间的一致性,可以避免因为维护一致性造成的各类紧耦合。