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接口,并不需要观察者具体的类是谁,做了什么或者其他细节.
这样的话,由于松耦合,改变主题或者观察者其中一方,并不会影响另一方,只要他们之间的接口仍被遵守,就可以自由地改变它.
降低对象之间的耦合度,也是面设对象设计的一个很重要的原则.