观察者模式之Observer和Subject

Posted smileblogs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了观察者模式之Observer和Subject相关的知识,希望对你有一定的参考价值。

 

package cn.it.observe2;

public interface Observer {

    void update(String status);

}

 

package cn.it.observe2;

public class ObserverStudent implements Observer {

    Subject subject;

    String studentName;

    public ObserverStudent(String studentName, Subject subject) {
        this.studentName = studentName;
        this.subject = subject;
        subject.registerObserver(this);
    }

    public void update(String status) {
        System.out.println(studentName + "得到作业:" + status);
    }
}

 

package cn.it.observe2;

public interface Subject {
    /**
     * 注册观察者
     */
    void registerObserver(Observer observer);

    /**
     * 移除观察者
     */
    void removeObserver(Observer observer);

    /**
     * 通知观察者
     */
    void notifyObservers(String name);
}

 

package cn.it.observe2;

import java.util.ArrayList;
import java.util.List;

public class SubjectTeacher implements Subject {

    List<Observer> observers = new ArrayList<Observer>();


    public void registerObserver(Observer observer) {
        observers.add(observer);
    }

    public void removeObserver(Observer observer) {
        int i = observers.indexOf(observer);
        if(i>=0){
            observers.remove(observer);
        }
    }

    public void notifyObservers(String status) {
        for (Observer observer : observers) {
            observer.update(status);
        }
    }


    //布置作业的方法,在方法最后,需要调用notifyObserver()方法,通知所有观察者更新状态
    public void setHomework(String status){
        System.out.println("今天的作业是" + status);
        this.notifyObservers(status);
    }
}

 

package cn.it.observe2;

/**
 * 观察者模式提供了一种对象设计,让主题和观察者之间耦合度降得很低,为什么呢?关于观察者的一切,主题只知道观察者实现了Observer接口,并不需要观察者具体的类是谁,做了什么或者其他细节.
 *
 *   这样的话,由于松耦合,改变主题或者观察者其中一方,并不会影响另一方,只要他们之间的接口仍被遵守,就可以自由地改变它.
 *
 *   降低对象之间的耦合度,也是面设对象设计的一个很重要的原则.  
 */
public class TestMain {

    public static void main(String[] args) {
        Subject teacher = new SubjectTeacher();

        Observer zhangsan = new ObserverStudent("张三", teacher);
        Observer lisi = new ObserverStudent("李四", teacher);

        ((SubjectTeacher) teacher).setHomework("第二页第六题");
        ((SubjectTeacher) teacher).setHomework("第三页第六题");
    }
}

 

以上是关于观察者模式之Observer和Subject的主要内容,如果未能解决你的问题,请参考以下文章

23种设计模式之观察者模式

行为类模式:观察者(Observer)

GOF23设计模式之观察者模式(observer)

观察者模式

观察者模式和发布/订阅模式的区别

观察者模式(Observer Pattern)