import java.util.ArrayList;
import java.util.List;
/**
* 观察者模式
* @author 15735400536
*
*/
public class ObserverPattern {
public static void main(String[] args) {
//创建一个主题
Observer observer = new Observer("工信部");
//创建四个订阅者
Observable xiaomi = new Observable("小米");
Observable hauwei = new Observable("华为");
Observable vivo = new Observable("vivo");
Observable oppo = new Observable("oppo");
observer.addObservable(xiaomi);
observer.addObservable(hauwei);
observer.addObservable(vivo);
observer.addObservable(oppo);
observer.sendMsg("明天统一发布新机");
observer.removeObservable(hauwei);
observer.sendMsg("HuaWei提供5G技术支持");
}
}
/**
* 观察者
* @author 15735400536
*
*/
class Observer {
/**
* 消息
*/
private String msg;
/**
* 名称
*/
private String name;
/**
* 被观察者对象列表
*/
private List<Observable> list = new ArrayList<Observable>();
/**
* 添加被观察者
* @param observable
*/
public void addObservable(Observable observable) {
list.add(observable);
}
/**
* 移除被观察者
* @param observable
*/
public void removeObservable(Observable observable) {
list.remove(observable);
}
/**
* 向被观察者发送消息
* @param msg
*/
public void sendMsg(String msg) {
System.out.println(this.name + "发布消息:" + msg);
for (Observable observable : list) {
observable.receive(msg);
}
}
public Observer(String name) {
super();
this.name = name;
}
}
/**
* 被观察者
* @author 15735400536
*
*/
class Observable {
/**
* 被观察者名称
*/
private String name;
/**
* 接收消息
* @param msg2
*/
public void receive(String msg) {
System.out.println(this.name + "接收消息: " + msg);
}
public Observable(String name) {
super();
this.name = name;
}
}
执行效果:

Java内置观察者模式:
在java.util包中包含有基本的Observer接口和Observable抽象类.功能上和上述代码类似.不过在使用上,就方便多了,因为许多功能比如说注册,删除,通知观察者的那些功能已经内置好了.
观察者模式的好处:
观察者模式提供了一种对象设计,让主题和观察者之间耦合度降得很低,为什么呢?关于观察者的一切,主题只知道观察者实现了Observer接口,并不需要观察者具体的类是谁,做了什么或者其他细节.
这样的话,由于松耦合,改变主题或者观察者其中一方,并不会影响另一方,只要他们之间的接口仍被遵守,就可以自由地改变它.
降低对象之间的耦合度,也是面设对象设计的一个很重要的原则.