上次学习了单例模式(点击进入:单例模式),今天趁空学习了一下观察者模式;
观察者模式定义了一种一对多的依赖关系, 让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,让他们能够自动更新自己。
在观察者模式中,有抽象主题角色(Subject),具体主题角色(ConcreteSubject),抽象观察者角色(Observer),具体观察者角色(ConcreteObserver)
①:抽象主题角色(Subject):可以把所有观察者对象的应用保存在集合当中,一个主题可以有任意数量的观察者对象。抽象主题角色可以提供一个接口,里面有添加,删除角色的方法,还有一个通过观察者角色的方法;
②:具体主题角色(ConcreteSubject):当主题角色发生改变时候,会给所有已经注册过的观察者对象发送通知
③:抽象观察者角色(Observer):定义一个接口,在得到主题角色的通知的时候,可以自动的更新自己.
④:具体观察者角色(ConcreteObserver)这个角色去实现更新自己。
看下观察者模式的类的UML图:
①: 创建一个Subject接口,里面有三个方法分别是addObserver,removeObserver,notifyObserver,
创建一个Observer接口,里面有个更新自己的方法update();
②: 创建ConcreteSubject实现Subject接口,相应实现里面的方法,把观察者对象注册进来;当时主题角色发生状态改变的时候,去调用notifyObserver()方法来给已经注册的观察者进行通知,然后观察者来自己更新自己.
③:创建ConcreterObserver实现Observer接口,当观察者接受到主题角色发的通知,自己调用update()更新自己.
接下来我们自己来模拟一个观察者模式(Observer)[其中涉及到2个接口,2个实现类,还有1个测试类]
1:Subject接口
package com.jiangqq.observer; /** * 抽象主题角色 * @author jiangqq * */ public interface Subject { /** * 注册添加观察者 * @param observer */ public void addObserver(Observer observer); /** * 刪除观察者 * @param observer */ public void removeObserver(Observer observer); /** * 对已经注册的观察者对象发送通知 * @param observer */ public void notifyObserver(String str); }2:具体主题角色ConcreteSubject
package com.jiangqq.observer; import java.util.ArrayList; import java.util.List; /** * 具体主题角色 :主要功能是添加,删除观察者,并且当主题角色内部状态发生改变的时候,来通知观察者 * @author jiangqq * */ public class ConcreteSubject implements Subject { List<Observer> list=new ArrayList<Observer>(); @Override public void addObserver(Observer observer) { list.add(observer); } @Override public void removeObserver(Observer observer) { list.remove(observer); } @Override public void notifyObserver(String str) { for(Observer observer:list) { observer.update(str); } } }3:抽象观察者角色(Observer)
package com.jiangqq.observer; /** * 抽象观察者角色 * @author jiangqq * */ public interface Observer { /** * 当观察者接受到主题发来的通知,自动调用update()来更新自己 */ public void update(String str); }4:具体观察者角色(ConcreteObserver)
package com.jiangqq.observer; public class ConcreteObserver implements Observer { @Override public void update(String str) { System.out.println("收到的信息是:"+str); } }5:测试类
package com.jiangqq.test; import com.jiangqq.observer.ConcreteObserver; import com.jiangqq.observer.ConcreteSubject; import com.jiangqq.observer.Observer; import com.jiangqq.observer.Subject; public class TestCustomObserver { public static void main(String[] args) { Subject sub=new ConcreteSubject(); Observer ob1=new ConcreteObserver(); Observer ob2=new ConcreteObserver(); Observer ob3=new ConcreteObserver(); //注册三个观察者,模拟当主题角色发送通知,三个观察者更新自己 sub.addObserver(ob1); sub.addObserver(ob2); sub.addObserver(ob3); sub.notifyObserver("今天天氣很好..."); //移除一個观察者 sub.removeObserver(ob1); sub.notifyObserver("今天天氣不好..."); } }
运行结果:
源代码下载链接:http://download.csdn.net/detail/jiangqq781931404/4091471