观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,使它们能够自动更新自己。




摘自搜狗百科 《观察者模式(Observer)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。 ​​面向对象设计​​ 的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。》



package com.tiger.observer;
/**
*
* Message -- 被观察者接口
* @author tiger
*
*/
public interface Message {
//注册入一个观察者
public void register(Observer observer);
//移除某位观察者
public void remove(Observer observer);
//通知所有观察者
public void notifyObservers(String msg);
}
package com.tiger.observer;

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

/**
* 消息的实现类 被观察者
* @author tiger
*
*/
public class MessageImpl implements Message{

//观察者集合
List

observers = new ArrayList<>();

/**
* 注册观察者
*/
@Override
public void register(Observer observer) {
observers.add(observer);
}
/**
* 移除观察者
*/
@Override
public void remove(Observer observer) {
observers.remove(observer);
}
/**
* 通知所有观察者
*/
@Override
public void notifyObservers(String msg) {
for (Observer observer : observers) {
observer.update(msg);
}
}
}
package com.tiger.observer;
/**
* [观察者] 接口
* @author tiger
*/
public interface Observer {
public void update(String msg);
}
package com.tiger.observer;
/**
* ObserverImpl -- 察者的实现类
* @author tiger
*
*/
public class ObserverImpl implements Observer{
//实现类的姓名
String name;

@Override
public void update(String msg) {
System.out.println(this.name+ " 收到 " + msg);
}

public ObserverImpl(String name) {
this.name = name;
}

}
package com.tiger.observer;

/**
* 测试类
* @author tiger
*/
public class ObserverTest {
public static void main(String[] args) {

Message msg = new MessageImpl();

//注册观察者
Observer observer1 = new ObserverImpl("彩兰");
Observer observer2 = new ObserverImpl("小红");
msg.register(observer1);
msg.register(observer2);

System.out.println("--- 第一次通知 ---");
msg.notifyObservers("今天要加班");

//移除观察者
msg.remove(observer1);

System.out.println("--- 最终通知 ---");
//消息发布
msg.notifyObservers("今天要加班");
}
}