上次学习了单例模式(点击进入:单例模式),今天趁空学习了一下观察者模式;
观察者模式定义了一种一对多的依赖关系, 让多个观察者对象同时监听某一个主题对象。这个主题对象在状态上发生变化时,会通知所有观察者对象,让他们能够自动更新自己。
在观察者模式中,有抽象主题角色(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