观察者模式之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("第三页第六题");
    }
}
原文地址:https://www.cnblogs.com/smileblogs/p/13131895.html