观察者模式(Observer)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。
观察者设计模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。
下面是基础的逻辑代码,已经注释的很清楚了:就是一个用户操作的监听管理器,管理器监听用户行为,然后刷新想要刷新的依赖于它的对象。仔细看,代码很简单,理解很关键。
package com.ggr.observer; import java.util.ArrayList; import java.util.List; /** * 事件监听管理规范 * @author GG * 本来我是直接写一个管理器不想用接口的,但是老师说不同的业务场景通知的方式可能不一样,所以我将这个管理器抽象出来 * 就是为了增加它的拓展性和灵活性,这也是面向对象真正的美丽之处吧。 */ public interface Manager{ //管理的事件集合 public List<Observer> list = new ArrayList<>(); //事件添加规范 public void addObserver(Observer o); //事件添加规范 public void removeObserver(Observer o); //通知刷新规范 public void notifyAllSubject(); }
package com.ggr.observer; /** * * @author GG *自定义的事件管理器,它的刷新方式就是全部刷新 */ public class MyManager implements Manager { @Override public void addObserver(Observer e) { list.add(e); } @Override public void removeObserver(Observer e) { list.remove(e); } @Override public void notifyAllSubject() { for (Observer observer : list) { observer.click(); } } }
package com.ggr.observer; /** * * @author GG *定义一个按钮实现点击规范 */ public class MyButton implements Observer{ public String name; public MyButton(String name){ this.name = name; } public void setName(String name) { this.name = name; } public String getName() { return name; } @Override public void click() { System.out.println("按钮"+this.name+"事件触发"); } }
package com.ggr.observer; /** * * @author GG * 定义一个图片按钮,实现了点击事件的规范 * */ public class MyImage implements Observer{ MyImage(String name){ this.name = name; } private String name; public void setName(String name) { this.name = name; } public String getName() { return name; } /** * 点击事件规范的实现 */ @Override public void click() { System.out.println("图片"+this.name+"事件触发"); } }
package com.ggr.observer; /** * 定义被观察者的规范,这里就是点击操作 * @author GG * */ public interface Observer { void click(); }
package com.ggr.observer; /** * * @author GG * 测试 * */ public class TestDao { public static void main(String[] args) { System.out.println("------------------------------------------"); Observer btn= new MyButton("login"); Observer image = new MyImage("my.png"); Manager photo = new MyManager(); photo.addObserver(btn); photo.addObserver(image); photo.notifyAllSubject(); } }