设计模式之-观察者模式
观察者模式(Observer)
完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。
观察者设计模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新。
我觉得百度的这个涂就很详细的画出了他们之间的关系
- Subject:抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。
- SubjectBookstore:具体主题(具体被观察者),该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发送通知。
- Observer:抽象观察者,是观察者者的抽象类,它定义了一个更新接口,使得在得到主题更改通知时更新自己。
- ConcrereStudent:具体观察者,是实现抽象观察者定义的更新接口,以便在得到主题更改通知时更新自身的状态。
下面举个栗子:
比如 有群小学生喜欢看七龙珠漫画,但是书店现在没有,等书店进了新书以后,然后书店去通知小学生前来购买漫画,
这样小学生就是观察者 书店就是被观察者。
定义观察者的抽象:
/** * 抽象观察者 * Created by Administrator on 2017/3/13. * * 定义一个接口,可以让被观察者更新时主动通知自己 */ public interface Observer { void update(String message); }
定义观察者的实现-小学生:
/** * 具体观察者-小学生 * Created by Administrator on 2017/3/13. * 具体观察者实现抽象观察者接口,可以在收到更新通知后更改自己状态 */ public class ObserverStudent implements Observer { private String userName; public ObserverStudent(String userName) { this.userName = userName; } @Override public void update(String message) { System.out.println(userName + "接到通知:" + message+"-放学就来买!"); } }
-----------------------------------------------------------------------------------------------------
定义被观察者的抽象:
/** * * 抽象的被观察者 * * 1、观察者对象保存在一个集合 * 2、可以增加和删除观察者对象 * 3、主动通知观察者 * Created by Administrator on 2017/3/13. */ public interface Subject { void addObserver(Observer observer); void delObserver(Observer observer); void notifyObserver(String message); }
定义具体的被观察者-书店:
/** * * 具体被的观察者,实现被观察中者的接口 * Created by Administrator on 2017/3/13. */ public class SubjectBookstore implements Subject{ //存放观察者的集合 private List<Observer> userList = new ArrayList<Observer>(); @Override public void addObserver(Observer observer) { userList.add(observer); } @Override public void delObserver(Observer observer) { userList.remove(observer); } @Override public void notifyObserver(String message) { for(Observer observer :userList){ observer.update(message); } } }
》》》》》》测试下:
public class Main { public static void main(String [] args){ Subject subject = new SubjectBookstore(); Observer ob1 = new ObserverStudent("小凯"); Observer ob2 = new ObserverStudent("小兰"); Observer ob3 = new ObserverStudent("小明"); subject.addObserver(ob1); subject.addObserver(ob2); subject.addObserver(ob3); subject.notifyObserver("七龙珠漫画到了!"); } }
测试结果如下:
以上就简单的实现了观察者模式,不过有优点就有缺点,以后再说!