观察者模式
一、定义
观察者模式有时候称为“发布-订阅”模式,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。
简介
观察者模式(Observer)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。
观察者设计模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。
二、代码展示
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();//声明学生对象tony
Teacher teacher = new Teacher(tony);//创建观察者对象【老师】,观察对象【tony】
Parent parent = new Parent(tony);//创建观察者对象【父母】,观察对象【tony】
tony.setScore(80, 80);//tony的成绩改动
tony.setScore(123, 123);//tony的成绩改动
}
}
/**
* 【发布】接口 或者称为 【被观察者接口】
*/
interface Subject {
/**
* 注册观察者
*
* @param observer
*/
void registerObserver(Observer observer);
/**
* 移除观察者
*
* @param observer
*/
void removeObserver(Observer observer);
/**
* 通知观察者
*/
void notifyObserver();
}
/**
* 【订阅】接口,或者称为【观察者】接口
*/
interface Observer {
/**
* 观察者操作
*/
void update();
}
/**
* 学生类,作为被观察者
*/
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