觀察者模式
一、定義
觀察者模式有時(shí)候稱為“發(fā)布-訂閱”模式,一個(gè)目標(biāo)物件管理所有相依于它的觀察者物件,并且在它本身的狀態(tài)改變時(shí)主動發(fā)出通知。這通常透過呼叫各觀察者所提供的方法來實(shí)現(xiàn)。此種模式通常被用來實(shí)現(xiàn)事件處理系統(tǒng)。
簡介
觀察者模式(Observer)完美的將觀察者和被觀察的對象分離開。舉個(gè)例子,用戶界面可以作為一個(gè)觀察者,業(yè)務(wù)數(shù)據(jù)是被觀察者,用戶界面觀察業(yè)務(wù)數(shù)據(jù)的變化,發(fā)現(xiàn)數(shù)據(jù)變化后,就顯示在界面上。面向?qū)ο笤O(shè)計(jì)的一個(gè)原則是:系統(tǒng)中的每個(gè)類將重點(diǎn)放在某一個(gè)功能上,而不是其他方面。一個(gè)對象只做一件事情,并且將他做好。觀察者模式在模塊之間劃定了清晰的界限,提高了應(yīng)用程序的可維護(hù)性和重用性。
觀察者設(shè)計(jì)模式定義了對象間的一種一對多的依賴關(guān)系,以便一個(gè)對象的狀態(tài)發(fā)生變化時(shí),所有依賴于它的對象都得到通知并自動刷新。
二、代碼展示
import java.util.ArrayList;
import java.util.List;
/**
* Created by yuwu on 2017/8/31.
*/
public class ObserverPattern {
public static void main(String[] args) {
Student tony = new Student();//聲明學(xué)生對象tony
Teacher teacher = new Teacher(tony);//創(chuàng)建觀察者對象【老師】,觀察對象【tony】
Parent parent = new Parent(tony);//創(chuàng)建觀察者對象【父母】,觀察對象【tony】
tony.setScore(80, 80);//tony的成績改動
tony.setScore(123, 123);//tony的成績改動
}
}
/**
* 【發(fā)布】接口 或者稱為 【被觀察者接口】
*/
interface Subject {
/**
* 注冊觀察者
*
* @param observer
*/
void registerObserver(Observer observer);
/**
* 移除觀察者
*
* @param observer
*/
void removeObserver(Observer observer);
/**
* 通知觀察者
*/
void notifyObserver();
}
/**
* 【訂閱】接口,或者稱為【觀察者】接口
*/
interface Observer {
/**
* 觀察者操作
*/
void update();
}
/**
* 學(xué)生類,作為被觀察者
*/
class Student implements Subject {
private int mathScore;
private int englishScore;
public int getMathScore() {
return mathScore;
}
public void setMathScore(int mathScore) {
this.mathScore = mathScore;
}
public int getEnglishScore() {
return englishScore;
}
public void setEnglishScore(int englishScore) {
this.englishScore = englishScore;
}
private List<Observer> observerList;
public Student() {
observerList = new ArrayList<>();
mathScore = 100;
englishScore = 100;
}
public void setScore(int mathScore, int englishScore) {
this.mathScore = mathScore;
this.englishScore = englishScore;
notifyObserver();
}
@Override
public void registerObserver(Observer observer) {
observerList.add(observer);
}
@Override
public void removeObserver(Observer observer) {
observerList.remove(observer);
}
@Override
public void notifyObserver() {
observerList.forEach((observer1) -> observer1.update());
}
}
/**
* 【觀察者】父母類
*/
class Parent implements Observer {
private Student student;
public Parent(Student student) {
this.student = student;
student.registerObserver(this);
}
@Override
public void update() {
System.out.println("Tell Parent: Your Child Get :" + "English: " +
student.getEnglishScore() + " 、" + "Math: " + student.getMathScore());
}
}
/**
* 【觀察者】老師類
*/
class Teacher implements Observer {
private Student student;
public Teacher(Student student) {
this.student = student;
student.registerObserver(this);
}
@Override
public void update() {
System.out.println("Tell Teacher: Your Child Get :" + "English: " +
student.getEnglishScore() + " 、" + "Math: " + student.getMathScore());
}
}
輸出:
Tell Teacher: Your Child Get :English: 80 、Math: 80
Tell Parent: Your Child Get :English: 80 、Math: 80
Tell Teacher: Your Child Get :English: 123 、Math: 123
Tell Parent: Your Child Get :English: 123 、Math: 123